58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
|
# standard imports
|
|||
|
import logging
|
|||
|
|
|||
|
# external imports
|
|||
|
from crypto_dev_signer.keystore.dict import DictKeystore
|
|||
|
|
|||
|
logg = logging.getLogger(__name__)
|
|||
|
|
|||
|
|
|||
|
class Wallet:
|
|||
|
|
|||
|
def __init__(self, signer_cls, keystore=DictKeystore(), checksummer=None):
|
|||
|
self.signer_constructor = signer_cls
|
|||
|
self.keystore = keystore
|
|||
|
self.signer = None
|
|||
|
self.signer_address = None
|
|||
|
self.nonce_oracle = None
|
|||
|
self.gas_oracle = None
|
|||
|
self.checksummer = checksummer
|
|||
|
self.use_checksum = False
|
|||
|
|
|||
|
|
|||
|
def from_config(self, config):
|
|||
|
wallet_keyfile = config.get('WALLET_KEY_FILE')
|
|||
|
if wallet_keyfile:
|
|||
|
logg.debug('keyfile {}'.format(wallet_keyfile))
|
|||
|
self.from_keyfile(wallet_keyfile, passphrase=config.get('WALLET_PASSPHRASE', ''))
|
|||
|
self.use_checksum = not config.true('_UNSAFE')
|
|||
|
|
|||
|
|
|||
|
def from_keyfile(self, key_file, passphrase=''):
|
|||
|
logg.debug('importing key from keystore file {}'.format(key_file))
|
|||
|
self.signer_address = self.keystore.import_keystore_file(key_file, password=passphrase)
|
|||
|
self.signer = self.signer_constructor(self.keystore)
|
|||
|
logg.info('key for {} imported from keyfile {}'.format(self.signer_address, key_file))
|
|||
|
return self.signer
|
|||
|
|
|||
|
|
|||
|
def from_address(self, address):
|
|||
|
self.signer_address = address
|
|||
|
if self.use_checksum:
|
|||
|
if self.checksummer == None:
|
|||
|
raise AttributeError('checksum required but no checksummer assigned')
|
|||
|
if not self.checksummer.valid(self.signer_address):
|
|||
|
raise ValueError('invalid checksum address {}'.format(self.signer_address))
|
|||
|
elif self.checksummer != None:
|
|||
|
self.signer_address = self.checksummer.sum(self.signer_address)
|
|||
|
logg.info('sender_address set to {}'.format(self.signer_address))
|
|||
|
return self.signer_address
|
|||
|
|
|||
|
|
|||
|
def get_signer(self):
|
|||
|
return self.signer
|
|||
|
|
|||
|
|
|||
|
def get_signer_address(self):
|
|||
|
return self.signer_address
|