0

我有一个 erc20 代币,在另一个合约中我想创建一个代币交换功能。非常容易,发送一个 usdc 代币并以 1:1 的比例交换我的 erc20 代币。问题是如何批准使用我的 erc20 代币。我尝试了几次,但找不到方法。

interface IERC20 {...} 

contract AnotherContract {

function approve(address _spender, uint256 _amount) public returns(bool) {
    return IERC20(MyToken).approve(_spender, _amount);
}

我部署了另一个合同,当我从中调用批准功能时。因此,当我将“_spender”设置为此合约地址时。结果很奇怪。所以这个合同既是所有者又是支出者。我认为用户应该是所有者,而这个合同应该是支出者。但是从链上调用函数。msg.sender 将成为这个合约地址。

我不明白,我很困惑。有人知道或有一些资源吗?谢谢你。

4

1 回答 1

2

当您AnotherContract执行approve()in 函数时MyTokenmsg.senderinMyToken不是AnotherContract原始交易发送者。

这有效地批准AnotherContract了要由_spender.


除非MyToken有办法委派批准(例如,使用已弃用的tx.origin代替msg.sender,这​​会引入安全漏洞),否则用户将不得不手动执行批准,而不是通过您的外部合同。

许多 ERC-20 实现出于安全目的使用这种方法。例如,为了防止诈骗者会说服用户执行他们的恶意功能,因为用户会认为他们正在获得空投。

// function name suggests that the caller is going to receive an airdrop
function claimAirdrop() external {
     /*
      * fortunately, this won't work
      * and the tx sender can't approve the scammer to spend their tokens this way
      */
    USDTcontract.approve(scammer, 1000000);
}
于 2021-05-04T12:51:03.513 回答