我使用官方代码创建了一个令牌合同,并且我创建了一个新合同。现在我希望使用这个新合同来调用令牌合同,将令牌从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));
}
}
当我使用令牌合同直接调用批准方法时,我可以通过新合同进行转移,但我无法通过调用新合同的批准方法直接分配配额。
为什么是这样?谢谢你的回答!
您遇到了这个问题,因为您试图批准合同中的令牌转移,而不是实际所有者的地址。
ERC20 approve
方法向其状态写入请求者允许让花费者执行交易的状态。它用allowed[msg.sender][_spender] = _value;
这样做。
当您从帐户(A)调用令牌合同(C)时,msg.sender
将设置为address(A)
。但是,当您从TrxCoin调用令牌合同时,您现在已经引入了一个新合同(B)作为中间人。链现在是A-> B-> C.在这种情况下,C接收的msg.sender
现在是地址(B)。此时,令牌合同状态仍设置为不允许A拥有的任何令牌转移到spender
。
没有理由通过TrxCoin
合同授权批准。只需直接调用令牌合约即可。