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);
}
}
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.
approve
.tokenContract.approve(hodlContractAddress, amount)
und dann tun hodlContract.hodl(tokenContractAddress, ...)
. Innerhalb der hodl
Funktion rufen Sie einfach auf transferFrom
.
Wiederholung 122442
stevyhacker
Benutzer19510
Wiederholung 122442
stevyhacker