Wie ruft man eine Funktion eines eingesetzten Smart Contracts in Ethereum von einem anderen Smart Contract auf?

Ich habe einen Smart Contract, der an einer bestimmten Adresse bereitgestellt wird (z. B. 0xABC). Dieser Vertrag ist ein ERC20-Token (z. B. ABC-Token) Smart Contract. Dieser Vertrag wurde am **November 2017 bereitgestellt .**

Jetzt möchte ich einen weiteren Smart Contract haben, der als Escrow fungieren kann und ABC-Token halten kann, bis eine bestimmte Bedingung erfüllt ist. Dieser Vertrag muss noch bereitgestellt werden.

Wie also kann der Treuhandvertrag den ABC-Token akzeptieren und den ABC-Token an den gültigen Benutzer freigeben , nachdem die Bedingung erfüllt ist? Ich möchte die Methode .transfer() des ABC-Token-Vertrags aus dem Escrow-Vertrag aufrufen, um Gelder von der Escrow zu erhalten und freizugeben.

Hinweis: Diese beiden Smart Contracts werden an unterschiedlichen Adressen bereitgestellt, da sie zu unterschiedlichen Zeiten bereitgestellt werden.

Antworten (2)

So etwas sollte funktionieren

contract Escrow {

    ERC20 token = ERC20(0xABCDEF....);

    event Deposit(address sender, uint amount);
    event Withdraw(address sender, uint amount);

    mapping (address => uint) deposits;

    // The user should approve the contract to retrieve tokens
    function deposit(uint amount) public {
        // Accept tokens in deposit
        token.transferFrom(msg.sender, amount);
        deposits[msg.sender] += amount;

        emit Deposit(msg.sender, amount);
    }

    function withdraw(uint amount) public {
        // Cannot withdraw more tokens than deposited
        require(deposits[msg.sender] >= amount);

        // Verify condition enable withdraw
        if (condition) {
            // Transfer tokens to sender
            deposits[msg.sender] -= amount;
            token.transfer(msg.sender, amount);

            emit Withdraw(msg.sender, amount);
        } else {
            revert();
        }
    }
}

Der Benutzer muss Ihren Vertrag genehmigen, damit er Token mit transferFrom übertragen kann. In Javascript steht so etwas wie ERC20Token.approve(Escrow.addrss, amount, { from: "0xTokenOwnerAddress" }), und rufen Sie dann die Escrow an , um eine Einzahlung zu tätigen EscrowContract.deposit(amount, { from: "0xTokenOwnerAddress"}).

Das kann gemacht werden. Wenn die Benutzer die Token jedoch per Überweisung an den Treuhandvertrag senden, wird der Treuhandvertrag nicht benachrichtigt. Sie müssen applyAndCall im ERC20-Token-Vertrag verwenden (vorausgesetzt, dies wurde implementiert).

approveAndCallwird Ihren Vertrag genehmigen, um Token vom Benutzer zu Ihrem Vertrag zu verschieben, und dann können Sie die Logik anwenden, die Sie benötigen, um zu ermöglichen, dass die Token zurückgezogen werden.

Um die Funktionen des ERC20-Token-Vertrags nutzen zu können, müssen Sie eine Instanz von ERC20TokenContract in Ihrem Vertrag erstellen.

Dann können Sie Folgendes tun:

ERC20TokenContract myInstance = ERC20TokenContract('contractAddress')

damit können Sie Dinge tun wie: myInstance.transfer(to,value)wo transferist eine Funktion für den ERC20TokenContract.

Sie müssen den Token-Vertrag in Ihren Escrow-Vertrag importieren. Hier gehe ich davon aus, dass der Name des Token-Vertrags ERC20TokenContract lautet.

Einzelheiten zur Implementierung finden Sie in dieser Antwort

Beachten Sie, dass, wenn Ihr ERC20-Vertrag „approveAndCall“ nicht implementiert, die einzige Alternative darin besteht, die Benutzer zu bitten, zuerst die Token an Ihre Vertragsadresse zu senden und dann die Funktion in Ihrem Vertrag auszuführen, die die Token sperrt.

Wie erstelle ich eine Instanz meines Token-Vertrags innerhalb eines Treuhandvertrags? durch die Verwendung von abi des Token-Vertrags oder nur der Adresse oder etwas anderem? Bitte helfen Sie mir, denn dies ist der einzige Weg, wie ich Escrow verwenden kann. Wenn Sie ein Beispiel geben können, das sehr, sehr hilfreich sein wird. Danke!
Es steht in der Antwort. Sie ERC20TokenContract myInstance = ERC20TokenContract('contractAddress')brauchen die ABI nicht, aber Sie müssen entweder den Vertrag des Tokens in die gleiche Datei wie Ihren Treuhandvertrag kopieren oder ihn mit 'import filename.sol' importieren. Sie können auch eine Schnittstelle zum Token-Vertrag erstellen, jedes dieser drei Dinge wird funktionieren.