Смарт-контракт ehtereum утверждает спонсора из другого контракта
У меня есть токен erc20, и в другом контракте я хочу создать функцию обмена токенами. Так что очень легко, можно отправить токен usdc и обменять мой токен erc20 в соотношении 1:1. Проблема в том, как разрешить потратить мой токен erc20. Я пытался несколько раз, но не могу найти способ.
interface IERC20 {...}
contract AnotherContract {
function approve(address _spender, uint256 _amount) public returns(bool) {
return IERC20(MyToken).approve(_spender, _amount);
}
Я развернул этот другой контракт и когда вызываю из него функцию утверждения. Итак, когда я установил _spender на этот адрес контракта. Результат странный. Таким образом, этот контракт является и владельцем, и спонсором. Я считаю, что пользователь должен быть владельцем, а этот контракт должен быть спонсором. Но вызов функции из цепочки. msg.sender будет этим адресом контракта.
Я не понимаю и сбиваю с толку. кто-нибудь знает или есть какие-то средства? Спасибо.
1 ответ
Когда вы выполняете
approve()
функция in, in - это не отправитель исходной транзакции.
Который эффективно одобряет
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);
}