Pedro Lobito
Pedro Lobito

Reputation: 98901

How to transfer tokens between wallets using geth

I've been struggling for the last couple of days trying to make a transfer of a customized token between 2 ethereum wallets.

I am using populus (python) and It seems to be quite easy to make an ETH transfer but I couldn't understand how to do the same with a custom token.

This is my python code:

from decimal import Decimal
import populus
from populus.utils.accounts import is_account_locked
from populus.utils.cli import request_account_unlock
from eth_utils import from_wei
from ico.utils import check_succesful_tx

# Which network we deployed our contract
chain_name = "horton"

# Owner account on geth
owner_address = "0xaeCb8415d5553F080d351e82b2000f123BFBc23C"

# Where did we deploy our token
contract_address = "0x15f173b7aca7cd4a01d5f8360e65fb4491d270c1"

receiver = "0x4c042bf285689891117AED16005004a6de2cC4FB"

amount = Decimal("1.0")

project = populus.Project()

with project.get_chain(chain_name) as chain:

    web3 = chain.web3
    print("Web3 provider is", web3.currentProvider)
    print("Owner address is", owner_address)
    print("Owner balance is", from_wei(web3.eth.getBalance(owner_address), "ether"), "ETH")

    # Goes through geth account unlock process if needed
    if is_account_locked(web3, owner_address):
        request_account_unlock(chain, owner_address, None)

    transaction = {"from": owner_address}
    FractionalERC20 = chain.contract_factories.FractionalERC20

    token = FractionalERC20(address=contract_address)
    decimals = token.call().decimals()
    decimal_multiplier = 10 ** decimals

    decimals = 18
    decimal_multiplier = 10 ** decimals
    print("Token has", decimals, "decimals")
    print("Owner token balance is", token.call().balanceOf(owner_address) / decimal_multiplier)

    # Use lowest denominator amount
    normalized_amount = int(amount * decimal_multiplier)

    # Transfer the tokens
    txid = token.transact({"from": owner_address}).transfer(receiver, normalized_amount)
    print("TXID is", txid)
    check_succesful_tx(web3, txid)

But I'm getting an error while executing the above code:

File "ICO_transfering_tokens.py", line 39, in <module>
    FractionalERC20 = chain.contract_factories.FractionalERC20
AttributeError: 'LocalGethChain' object has no attribute 'contract_factories'

I understand the error but not how to fix it.

Upvotes: 2

Views: 1572

Answers (1)

Mikko Ohtamaa
Mikko Ohtamaa

Reputation: 83828

Apparently you have copied this code from ICO project. To make it easier for users to answer, it makes sense to tell where did you get the source code. This project has its own chat group here.

The reason for the exception is that in some versions of Populous the API was changed and the example you are using is for the old version of an API. Please upgrade both ICO repository and Populous to the latest compatible version configuration which you can find in ICO repo Travis output.

Please replace this line:

FractionalERC20 = chain.contract_factories.FractionalERC20

With this:

from ico.utils import get_contract_by_name

FractionalERC20 = = get_contract_by_name(chain, "FractionalERC20")

Upvotes: 2

Related Questions