def _transfer(self, context, pub_key, transfer_payload): signer_key, signer_account = self.get_account_by_pub_key(context, pub_key) if self.zero_address in [transfer_payload.address_to, signer_key]: raise InvalidTransaction("Zero address cannot involve in any operation.") if signer_key == transfer_payload.address_to: raise InvalidTransaction("Account cannot send tokens to itself.") receiver_account = get_data(context, Account, transfer_payload.address_to) if not receiver_account: receiver_account = Account() if not signer_account: signer_account = Account() if signer_account.balance < transfer_payload.value: raise InvalidTransaction("Not enough transferable balance. Signer's current balance: {}" .format(signer_account.balance)) receiver_account.balance += transfer_payload.value signer_account.balance -= transfer_payload.value LOGGER.info('Transferred {} tokens from {} to {}'.format(transfer_payload.value, signer_key, transfer_payload.address_to)) return { signer_key: signer_account, transfer_payload.address_to: receiver_account }
def _genesis(self, context, pub_key, genesis_payload): signer_key, account = self.get_account_by_pub_key(context, pub_key) genesis_status = get_data(context, GenesisStatus, self.zero_address) if not genesis_status: genesis_status = GenesisStatus() elif genesis_status.status: raise InvalidTransaction('Genesis is already initialized.') genesis_status.status = True account = Account() account.balance = genesis_payload.total_supply LOGGER.info( 'Generated genesis transaction. Issued {} tokens to address {}'. format(genesis_payload.total_supply, signer_key)) return {signer_key: account, self.zero_address: genesis_status}
def test_genesis_empty(self): TOTAL_SUPPLY = 10000 zero_address = self.handler.make_address(ZERO_ADDRESS) self.send_transaction(TokenMethod.GENESIS, TokenClient.get_genesis_payload(TOTAL_SUPPLY), [zero_address, self.account_address1]) self.expect_get({self.account_address1: None}) self.expect_get({zero_address: None}) genesis_status = GenesisStatus() genesis_status.status = True account = Account() account.balance = TOTAL_SUPPLY self.expect_set({ self.account_address1: account, zero_address: genesis_status }) self.expect_ok()
def get_account(self, address): account = Account() account.ParseFromString(self.get_value(address)) return account
def get_account_model(self, balance): account = Account() account.balance = int(balance) return account
def get_account_by_pub_key(self, context, pub_key): address = self.make_address_from_data(pub_key) account = get_data(context, Account, address) if account is None: return address, Account() return address, account