Wie übertrage ich einen beliebigen ERC20-Token in Solidity von meinem Smart Contract?

Ich habe Probleme mit der Übertragung von ERC20-Token in meinem Smart Contract. Code ist unten. Schauen Sie sich die Funktion hodl an, ich möchte einen beliebigen Token auf diesen Smart Contract hinterlegen, aber obwohl ich eine Transaktion durchführe, werden keine Token übertragen, ich bin mir nicht sicher warum, weil ich die Funktion transferFrom aufrufe. Habe es auch verzweifelt mit Transfer versucht, aber das ist wahrscheinlich nur für Token-Smart-Contract-Transfers.

Was ich hier zu entwickeln versuche, ist ein intelligenter Vertrag, der eine Token-Einzahlung akzeptiert und hält, bis eine vom Benutzer bei der Durchführung einer Transaktion festgelegte Frist abgelaufen ist.

pragma solidity ^0.4.19;

contract ERC20Interface {
function totalSupply() public constant returns (uint);

function balanceOf(address tokenOwner) public constant returns (uint balance);

function allowance(address tokenOwner, address spender) public constant returns (uint remaining);

function transfer(address to, uint tokens) public returns (bool success);

function approve(address spender, uint tokens) public returns (bool success);

function transferFrom(address from, address to, uint tokens) public returns (bool success);

event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}

contract hodlForYouContractV3 {

event Hodl(address indexed hodler, address token, uint  amount, uint timeLimit);

event PanicSell(address indexed hodler, address token, uint  amount, uint timediff);

event Withdrawal(address indexed hodler, address token, uint  amount);

struct Hodler {
    uint etherBalance;
    address hodler;
    mapping(address => Token) tokens;
}

struct Token {
    bytes32 symbol;
    uint tokenBalance;
    address tokenAddress;
    uint timeLimit;
}

mapping(address => Hodler) public hodlers;


function hodl(address token, byte tokenSymbol, uint256 amount, uint256 timeLimit) {

    hodlers[msg.sender] = Hodler(0, msg.sender);
    Hodler hodler = hodlers[msg.sender];
    hodler.tokens[token] = Token(tokenSymbol, amount, token, timeLimit);
    //        hodler.tokens[token].timeLimit = timeLimit;
    //        hodler.tokens[token].tokenBalance = amount;
    ERC20Interface(token).approve(msg.sender, amount);
    ERC20Interface(token).transfer(this, amount);
    ERC20Interface(token).transferFrom(msg.sender, this, amount);
    Hodl(msg.sender, token, amount, timeLimit);

}


function withdraw(address token) {
    Hodler hodler = hodlers[msg.sender];
    require(block.timestamp > hodler.tokens[token].timeLimit);

    uint amount = hodler.tokens[token].tokenBalance;
    hodler.tokens[token].tokenBalance = 0;
    ERC20Interface(token).approve(msg.sender, amount);
    ERC20Interface(token).transferFrom(this, msg.sender, amount);

    Withdrawal(msg.sender, token, amount);

}


function panicSell(address token) {
    //This function should have a fee for quicker withdrawing without waiting
    Hodler hodler = hodlers[msg.sender];

    uint amount = hodler.tokens[token].tokenBalance;
    hodler.tokens[token].tokenBalance = 0;
    ERC20Interface(token).approve(msg.sender, amount);
    ERC20Interface(token).transferFrom(this, msg.sender, amount);

    PanicSell(msg.sender, token, amount, hodler.tokens[token].timeLimit - block.timestamp);

}

}
hodlers[msg.sender] = Hodler(0, msg.sender); Deine Struktur hat 3 Elemente, du gibst ihr nur zwei. Außerdem haben Sie die Funktion für den Token-Standard nicht implementiert
3-Element-Parameter ist eine Zuordnung, die ich in der nächsten Zeile handhabe. Welche Funktion für den Token-Standard?
@Andromelus Hast du es versucht? Sie dürfen eine solche Struktur initialisieren. Der nicht angegebene Wert erhält nur seinen Standardwert. Außerdem gibt es keinen Grund, die ERC20-Token-Standardfunktionen zu implementieren, da dieser Vertrag kein Token ist.
Aber er versucht, die Funktionen zu verwenden, ohne sie nach meinem Verständnis zu implementieren
Ich werfe eine Token-Adresse in einen Token-Vertrag, Funktionen sind im Token-Smart-Vertrag implementiert, zumindest habe ich das irgendwo gelesen.

Antworten (1)

Diese Zeile ergibt keinen Sinn:

ERC20Interface(token).approve(msg.sender, amount);

Bei einem Anruf gibt es zwei Akteure approve: den Token-Besitzer und den Token-Spender.

Der Token-Eigentümer ruft an approve(spender, amount), damit der Spender diese Token dann ausgeben kann.

Hier ist der Vertrag der Besitzer des Tokens und der Benutzer, der die Funktion aufgerufen hat, der Spender.

Ich denke, Sie möchten, dass der Benutzer vor dem Anruf approve(contract, amount)anruft hodl, und dann möchten Sie token.transferFrom(msg.sender, this, amount)diese Token vom Benutzer auf den Vertrag übertragen.

Also muss ich diese als zwei separate Transaktionen durchführen, damit sie ordnungsgemäß funktionieren, und dem Vertrag die Erlaubnis erteilen, Token zu übertragen?
Ja. Hoffentlich ist klar, warum dies der Fall sein muss: Andernfalls könnte Ihr Vertrag nur Token von irgendjemandem stehlen. :-)
Ok, danke, ich werde das jetzt testen und zwei Funktionen implementieren, wie Sie vorgeschlagen haben. Ich muss mich natürlich um die Sicherheit kümmern, aber zuerst, damit es überhaupt funktioniert :)
Dies funktioniert nicht, ich habe versucht, zwei Funktionen zu erstellen und die erste aufzurufen, wenn die Transaktion den Aufruf der zweiten beendet, aber immer noch keine Token gesendet werden. genehmige Zeile, ich erhalte ein Genehmigungsereignis in den Remix-Ide-Protokollen ERC20Interface(token).approve(this, amount);
Der erste Aufruf muss der Benutzer sein, der den Tokenvertrag aufruft approve.
Zur Verdeutlichung sollte der Benutzer tokenContract.approve(hodlContractAddress, amount)und dann tun hodlContract.hodl(tokenContractAddress, ...). Innerhalb der hodlFunktion rufen Sie einfach auf transferFrom.