Ich habe eine Schnittstelle zu Dai von meinem Vertrag und möchte einem Benutzer erlauben, den Vertrag zu genehmigen, um sein Dai zu übertragen. Dai verwendet DSToken-Code, der eine Genehmigungsfunktion hat, die sich auf msg.sender stützt:
function approve(address guy, uint wad) public returns (bool) {
_approvals[msg.sender][guy] = wad;
Approval(msg.sender, guy, wad);
return true;
}
Ich habe eine Schnittstelle, die mein Vertrag erbt, die den Schnittstellenvertrag wie aufruft
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);
}
}
Das Problem ist also, dass sich msg.sender bis zum Token-Vertrag ändert, also denke ich, dass der Schnittstellencode genehmigt wird und nicht der Hauptvertrag, der das Dai übertragen muss. Wie löst man das am besten?
Nicht möglich.
Ich glaube du missverstehst die approve
Methode. Ein Vertrag kann sich unter keinen Umständen selbst genehmigen, Gelder anderer Personen auszugeben.
Sie müssen es am Frontend koordinieren, damit zwei Transaktionen vom Benutzer in einer choreografierten Weise gesendet werden.
Ich hoffe es hilft.
Ich glaube nicht, dass das, was du vorhast, möglich ist.
Stellen Sie sich vor, Sie könnten eine Funktion erstellen, die einen Betrag eines Tokens genehmigt, der von einer anderen Adresse ausgegeben werden soll. Wenn ich einen böswilligen Vertrag abgeschlossen und Sie dazu gebracht hätte, diese Funktion aufzurufen, könnte ich auf diese Weise alle Ihre Token stehlen.
Dasselbe gilt für die Übertragungsfunktion.
Aus diesem Grund verwenden diese Funktionen msg.sender
, genau um sicherzustellen, dass nur die genaue Person, die diese Funktion (innerhalb eines bestimmten Benutzerkontexts) aufrufen können soll, dies explizit tut.
Jaime