1

我使用官方代码创建了一个token合约,并且我创建了一个新合约。现在希望用这个新合约调用token合约,将token从A账户转移到B账户,遇到配额不可转让的问题。

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));
    }
}

当我使用代币合约直接调用approve方法时,可以通过新合约进行转账,但是不能通过新合约调用approve方法直接分配配额。

为什么是这样?谢谢你的回答!

4

1 回答 1

1

你遇到这个问题是因为你试图从你的合约中批准代币的转移,而不是实际所有者的地址。

ERC20approve方法向其状态写入请求者正在授予让支出者执行交易的权限。它使用类似allowed[msg.sender][_spender] = _value;.

当您从您的账户 (A) 调用代币合约 (C) 时,msg.sender设置为address(A)。但是,当您从 TrxCoin 调用代币合约时,您现在已经引入了一个新合约 (B) 作为中间人。链现在是 A->B->C。在这种情况下,msg.senderC 收到的现在是地址(B)。此时,Token 合约状态仍设置为不允许 A 拥有的任何代币转移到spender.

没有理由通过TrxCoin合同委派批准。直接调用Token合约即可。

于 2017-12-28T19:23:43.227 回答