У меня есть интерфейс к 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. Каков наилучший способ решить эту проблему?
Невозможно.
Я думаю, вы неправильно понимаете approve
метод. Контракт ни при каких обстоятельствах не может одобрить расходование чужих средств.
Вам нужно скоординировать это на внешнем интерфейсе, чтобы две транзакции отправлялись пользователем в хореографической манере.
Надеюсь, поможет.
Я не думаю, что то, что вы пытаетесь сделать, возможно.
Представьте, что вы можете создать функцию, которая одобряет количество токенов, которые будут потрачены по другому адресу. Если бы я заключил вредоносный контракт и заставил вас вызвать эту функцию, я мог бы таким образом украсть все ваши токены.
То же самое с передаточной функцией.
Вот почему эти функции используют msg.sender
, именно для того, чтобы убедиться, что только конкретный человек, который должен иметь возможность вызывать эту функцию (в конкретном пользовательском контексте), делает это явным образом.
Хайме