以太坊智能合约批准来自另一个合约的支出者
ehtereum smart contract approve spender from another contract
我有一个 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 调用函数。 msg.sender 将成为这个合约地址。
我不明白,很困惑。有人知道或有一些资源吗?谢谢。
当您的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);
}
我有一个 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 调用函数。 msg.sender 将成为这个合约地址。
我不明白,很困惑。有人知道或有一些资源吗?谢谢。
当您的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);
}