Wie können Sie ein Token über eine Schnittstelle genehmigen?

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?

Der msg.sender beim Dai-Vertrag ist die Adresse Ihres Hauptvertrags DaiInterface. Die Frage ist, ob die genehmigte Adresse Ihre Vertragsadresse oder eine EOA ist.

Antworten (2)

Nicht möglich.

Ich glaube du missverstehst die approveMethode. 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.

  1. Benutzer => DAI (Token-Vertrag), genehmigen Sie den Zielvertrag (Ihren), um einen Betrag abzuheben.
  2. Benutzer => Vertrag, transferFrom DAI (Token-Vertrag), übe die in Schritt 1 erteilte Erlaubnis aus.

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.