我使用官方代码创建令牌合同,并创建了一份新合同。现在我希望使用这个新合同来调用令牌合同,将令牌从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));
}
}
当我使用令牌合约直接调用批准方法时,我可以通过新合约进行转移,但我无法通过调用新合同的批准方法直接分配配额。
这是为什么?谢谢你的回答!
答案 0 :(得分:1)
您之所以遇到此问题是因为您尝试批准合同中的令牌转移,而不是实际所有者的地址。
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
合同进行审批。只需直接调用令牌合约即可。