2017-12-28 31 views
0

トークン契約を作成するために公式コードを使用しました。新しい契約を作成しました。今度は、この新しい契約を使用してトークン契約を呼び出し、AアカウントからBアカウントにトークンを譲渡し、譲渡可能なクォータがないという問題に遭遇することを望みます。私が直接承認メソッドを呼び出すためにトークン契約を使用する場合他のnon-eth erc-20トークン転送操作の固執契約

pragma solidity ^0.4.17; 

interface Token { 
    function approve(address spender, uint256 value) public returns (bool); 
    function transferFrom(address from, address to, uint256 value) public returns (bool); 
} 


/** 
* The TrxCoin contract does this and that... 
*/ 
contract TrxCoin { 

    Token token = Token(0xAc08fe3C9F442990C52904dE997D9972499bD3E6); 

    function getContractAddr() view public returns (address) { 
     return this; 
    } 

    function approve(address spender, uint256 value) public { 
     require(token.approve(spender, value)); 
    } 

    function transfer(address _to, uint value) public payable { 
     require(token.transferFrom(msg.sender, _to, value)); 
    } 
} 

は、私は新しい契約を通じて転送することができますが、私は新しい契約に承認メソッドを呼び出すことによって直接クォータを割り当てることができません。

これはなぜですか?答えてくれてありがとう!

答えて

1

実際の所有者の住所ではなく、契約のトークンの転送を承認しようとしているため、この問題が発生します。

ERC20 approveメソッドは、リクエスタがトランザクションを実行できるようにリクエスタが許可している状態を書き込みます。それはallowed[msg.sender][_spender] = _value;のようなものでこれを行います。

アカウント(A)からトークン契約(C)を呼び出す場合、msg.senderaddress(A)に設定されます。しかし、TrxCoinからトークンコントラクトを呼び出すときは、新しい契約(B)を仲介者として導入しました。チェーンはA→B→Cになりました。この場合、Cが受信するmsg.senderはアドレス(B)になります。この時点で、トークンの契約状態は、Aが所有するトークンがspenderに転送されないように設定されています。

承認のためにTrxCoin契約を委任する理由はありません。トークン契約を直接呼び出すだけです。

+0

ありがとうございます。 approreを使用して契約のTrxCoinのアドレスをアドレスAのアドレスに設定すると、転送操作を実行できないことがありますか? – Leo