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.
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).
approveAndCall
wird 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 transfer
ist 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.
Akshay Pilankar
Jaime
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.