How to Transfer Controller-linked Tokens

Tai Kersten
Proof of Fintech DevBlog
3 min readJan 29, 2018

The Proof Tokensale has concluded and now we are headed towards deploying the first of the AMP contracts allowing for tokenholders to collect rewards. We have received many requests from tokenholders asking for clarification on how to transfer their tokens.

We have noticed a high number of transfer() calls heading to our controller contract. This is an understandable mistake as the controller contract was the address where funds were originally sent. However, sending a transfer() call to this contract will not lead to a successful send since that particular call exists only in the ‘token’ contract itself. This post will run through how to find the token contract and how to transfer tokens using that contract.

The Proof Tokensale utilized the minimi-controller architecture for PRFT. The reason for this was so that our mint-based tokensale could be legislated and executed entirely on-chain over the Ethereum Network with very little intervention from our frontends.

In short, the ‘controller’ contract, or where funds were sent is a separate contract from the ‘token’ contract which handles the accounting, allowances, transfers, and supply of the PRFT token. To summarize:

The PRFT Controller is here:

(0x15eaC74d043D9945823aFD171677ab2F72215003)

This contract is where tokensale information can be found about totalSupply, whether the tokensale is live, and where other controllers and token contracts sit. It is the ‘API’ or main interface for the tokensale itself.

while the PRFT ERC-20 Contract is here:

(0xC5ceA8292e514405967D958c2325106f2f48dA77)

This contract is where the tokens are stored and is the main place for users and our tokensale dashboard interact with their tokens. All transfer calls must go here.

Transferring Tokens with DataField

To transfer tokens, make sure to send your ABI encoded:

transfer(_to,_amount)

string to the contract 0xC5ceA8292e514405967D958c2325106f2f48dA77 after fill in the fields with the data you want. If you know how to do this, you are done. Otherwise continue reading to learn how to do this with Metamask.

Transferring Tokens with Metamask

Transferring tokens with My Ether Wallet is easy after the first try but can be a bit of a hassle if you haven’t done it before. Here is a quick 3 step guide for doing transfers. Some knowledge of MEW is assumed.

1. To transfer you will need 3 things:

  • The Token contract address (0xC5ceA8292e514405967D958c2325106f2f48dA77)
  • The Token ABI
[{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_addresses","type":"address[]"},{"name":"_balances","type":"uint256[]"}],"name":"importPresaleBalances","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"creationBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"presaleBalancesLocked","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_blockNumber","type":"uint256"}],"name":"balanceOfAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"lockPresaleBalances","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newController","type":"address"}],"name":"transferControl","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOTAL_PRESALE_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"parentToken","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_blockNumber","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_snapshotBlock","type":"uint256"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"}],"name":"createCloneToken","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"bool"}],"name":"enableMasterTransfers","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"masterTransfersEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"transfersEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"parentSnapShotBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokenFactory","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"bool"}],"name":"enableTransfers","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"masterWallet","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"inputs":[{"name":"_tokenFactory","type":"address"},{"name":"_parentToken","type":"address"},{"name":"_parentSnapShotBlock","type":"uint256"},{"name":"_tokenName","type":"string"},{"name":"_tokenSymbol","type":"string"}],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_token","type":"address"},{"indexed":true,"name":"_owner","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"ClaimedTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cloneToken","type":"address"}],"name":"NewCloneToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

2. Next, navigate to https://www.myetherwallet.org

(check your url three times and we recommend, highlight copy and then paste for transferring this url)

Select the option “Contract” at the top of the My Ether Wallet page. Fill in the details with the information above. It should look something like this:

  • under _to add the address you want to send to.
  • In the _amount add the amount of tokens you want to send in units of wei. This means if you want to send 1 token you must enter 1000000000000000000 this is the same as (1 * 10¹⁸) as your _amount since the token presumes 18 decimals. (this tool can help: https://etherconverter.online/)

3. Locate a Wallet with the tokens you want to send

Choose the wallet which holds your tokens. If you bought tokens on the proof tokensale dashboard, you can download this wallet and use the same decryption password with the MEW JSON file unlocking feature. Make sure to send through the appropriate amount of gas. The transfer function uses a fair amount of gas depending on network congestion as it leads to multiple state changes on the contract storage.

--

--