In contrast to other popular wallet implementations, all of a Dapper user’s assets (ETH, ERC20, ERC721, etc.) are associated with the wallet's public address (contract account). By construction, there’s no private key- exports from Dapper require function calls on the interface itself.
Administration and use of Dapper is controlled by what we refer to as device keys. More than one device key can exist. A device key doesn’t have to be the "creator" or "owner" of the interface contract- it can also be a smart contract, providing a way to add functionality. As these keys allow unrestrained value transfer from the wallet, it is highly recommended that device keys have a cosigner address set to improve security.
Dapper works to provide seamless user experiences and lowers the barrier to access assets and the blockchain. We achieve multi-signature capabilities by way of the invoke() method. Any key can sign the outer transaction that allows you to perform value transactions- we use a cosigner address set per device key. The invoke() method allows for a cosigning check on operations including value transfers, device key administration, and backup transactions.
Dapper acts as cosigner (or second signature) using the smart contract wallet's invoke() methods. Each invoke call is designed to be given a list of operations to complete, even if its a single operation. There is a 'per-transaction' overhead normally paid with a ethereum transaction; with the smart contract wallet's invoke methods, this overhead can be paid one time, resulting in a net gas savings if a minimum number of operations are sent as part of one call to invoke. With cosigning in place, we’re able to help users save time and money.