微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以太坊智能合约批准来自另一个合约的支出者

如何解决以太坊智能合约批准来自另一个合约的支出者

我有一个 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 将成为这个合约地址本身。

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

解决方法

当您的 AnotherContract 执行 approve() 中的 MyToken 函数时,msg.sender 中的 MyTokenAnotherContract - 不是原始交易发送者。

这有效地批准了 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);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。