Source code for graphenecommon.aio.wallet

# -*- coding: utf-8 -*-
import logging

from graphenecommon.exceptions import KeyNotFound
from ..wallet import Wallet as SyncWallet


log = logging.getLogger(__name__)


class Wallet(SyncWallet):
    """ The wallet is meant to maintain access to private keys for
        your accounts. It either uses manually provided private keys
        or uses a SQLite database managed by storage.py.

        :param array,dict,string keys: Predefine the wif keys to shortcut the
               wallet database

        .. note:: Wallet should be instantiated synchroously e.g.

        .. code-block:: python

            w = Wallet()

        Three wallet operation modes are possible:

        * **Wallet Database**: Here, the library loads the keys from the
          locally stored wallet SQLite database (see ``storage.py``).
        * **Providing Keys**: Here, you can provide the keys for
          your accounts manually. All you need to do is add the wif
          keys for the accounts you want to use as a simple array
          using the ``keys`` parameter to your blockchain instance.
        * **Force keys**: This more is for advanced users and
          requires that you know what you are doing. Here, the
          ``keys`` parameter is a dictionary that overwrite the
          ``active``, ``owner``, ``posting`` or ``memo`` keys for
          any account. This mode is only used for *foreign*
          signatures!
    """

[docs] async def getOwnerKeyForAccount(self, name): """ Obtain owner Private Key for an account from the wallet database """ account = await self.rpc.get_account(name) for authority in account["owner"]["key_auths"]: key = self.getPrivateKeyForPublicKey(authority[0]) if key: return key raise KeyNotFound
[docs] async def getMemoKeyForAccount(self, name): """ Obtain owner Memo Key for an account from the wallet database """ account = await self.rpc.get_account(name) key = self.getPrivateKeyForPublicKey(account["options"]["memo_key"]) if key: return key return False
[docs] async def getActiveKeyForAccount(self, name): """ Obtain owner Active Key for an account from the wallet database """ account = await self.rpc.get_account(name) for authority in account["active"]["key_auths"]: try: return self.getPrivateKeyForPublicKey(authority[0]) except Exception: pass return False
[docs] async def getAccountsFromPublicKey(self, pub): """ Obtain all accounts associated with a public key """ result = await self.rpc.get_key_references([str(pub)]) names = result[0] return names
[docs] async def getAccountFromPublicKey(self, pub): """ Obtain the first account name from public key """ # FIXME, this only returns the first associated key. # If the key is used by multiple accounts, this # will surely lead to undesired behavior names = list(await self.getAccountsFromPublicKey(str(pub))) if names: return names[0]
[docs] async def getAccounts(self): """ Return all accounts installed in the wallet database """ pubkeys = self.getPublicKeys() accounts = [] for pubkey in pubkeys: # Filter those keys not for our network if pubkey[: len(self.prefix)] == self.prefix: accounts.extend(await self.getAccountsFromPublicKey(pubkey)) return accounts