本文介绍了Ehtereum智能合同批准来自另一份合同的消费者的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个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);
}
我部署了另一个合同,当我从它调用Approve函数时。因此,当我将‘_spender’设置为此合同地址时。结果很奇怪。因此,这份合同是所有者和消费者双方的..因为我认为用户应该是所有者,而这份合同应该是一个花钱的人。而是从OnChain调用函数。消息发件人将是此合同地址本身。
我不明白,而且很困惑。有谁知道或有资源吗?谢谢。
推荐答案
当您的AnotherContract
执行MyToken
中的approve()
函数时,MyToken
中的msg.sender
是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);
}
这篇关于Ehtereum智能合同批准来自另一份合同的消费者的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!