2

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.

TylerH
  • 20,799
  • 66
  • 75
  • 101
Pedro Lobito
  • 94,083
  • 31
  • 258
  • 268
  • Try to download the new version of Populus, and set a local horton chain the new way http://populus.readthedocs.io/en/latest/tutorial.part-2.html – Aviah Laor Oct 14 '17 at 15:40

1 Answers1

2

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")
Mikko Ohtamaa
  • 82,057
  • 50
  • 264
  • 435
  • I've tried your code but I get an error: `KeyError: "Key 'priority' not found in {}"` - https://pastebin.com/zwSC8uam – Pedro Lobito Oct 15 '17 at 23:04
  • Please check that you have compatible Python library versions as per https://github.com/TokenMarketNet/ico/blob/master/requirements.txt – Mikko Ohtamaa Oct 16 '17 at 07:20