Как вы можете утвердить токен через интерфейс?

У меня есть интерфейс к Dai из моего контракта, и я хочу разрешить пользователю одобрять контракт на передачу своего Dai. Dai использует код DSToken, в котором есть функция утверждения, основанная на msg.sender:

function approve(address guy, uint wad) public returns (bool) {
    _approvals[msg.sender][guy] = wad;

    Approval(msg.sender, guy, wad);

    return true;
}

У меня есть интерфейс, который наследует мой контракт, который вызывает контракт интерфейса, например

contract DaiInterface {

    function approve(address guy, uint wad) public returns (bool);
}



contract DaiTransferrer is Ownable {

    DaiInterface daiContract;

    function approveDai(address guy, uint wad) public {
        daiContract.approve(guy, wad);
    }
}

Таким образом, проблема в том, что msg.sender изменяется к тому времени, когда он попадает в контракт токена, поэтому я думаю, что код интерфейса будет одобрен, а не основной контракт, который должен передавать Dai. Каков наилучший способ решить эту проблему?

msg.sender в контракте Dai — это адрес вашего основного контракта DaiInterface. Вопрос в том, является ли утвержденный адрес адресом вашего контракта или EOA.

Ответы (2)

Невозможно.

Я думаю, вы неправильно понимаете approveметод. Контракт ни при каких обстоятельствах не может одобрить расходование чужих средств.

Вам нужно скоординировать это на внешнем интерфейсе, чтобы две транзакции отправлялись пользователем в хореографической манере.

  1. Пользователь => DAI (токен-контракт), подтвердите целевой контракт (ваш) для снятия суммы.
  2. Пользователь => контракт, передача от DAI (токен-контракт), используйте разрешение, предоставленное на шаге 1.

Надеюсь, поможет.

Я не думаю, что то, что вы пытаетесь сделать, возможно.

Представьте, что вы можете создать функцию, которая одобряет количество токенов, которые будут потрачены по другому адресу. Если бы я заключил вредоносный контракт и заставил вас вызвать эту функцию, я мог бы таким образом украсть все ваши токены.

То же самое с передаточной функцией.

Вот почему эти функции используют msg.sender, именно для того, чтобы убедиться, что только конкретный человек, который должен иметь возможность вызывать эту функцию (в конкретном пользовательском контексте), делает это явным образом.