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
        }
示例#2
0
 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}
示例#3
0
    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
示例#6
0
 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