Смарт-контракт 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);
}
Другие вопросы по тегам