Reputation: 98901
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
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