Ich versuche, einen erc827token-Vertrag zu erstellen, der unterschiedliche Mengen an Ether akzeptiert (0 für Airdrop, 0,001, 0,002 >> für Spenden.
code::
contract Airdrop coin is ERC827Token, Ownable {
string public constant name = "SimpleToken"; // solium-disable-line uppercase
string public constant symbol = "SIM"; // solium-disable-line uppercase
uint8 public constant decimals = 18; // solium-disable-line uppercase
uint256 public constant INITIAL_SUPPLY = 10000 * (10 ** uint256(decimals));
/**
* @dev Constructor that gives msg.sender all of existing tokens.
*/
constructor() public {
totalSupply_ = INITIAL_SUPPLY;
}
function getAirdrop() external payable {
if (msg.value < 0.005 ether) {
balances[msg.sender] += 4000;
} else if ( (msg.value >= 0.005 ether) && (msg.value < 0.008)) {
balances[msg.sender] += 9000;
} else if ( (msg.value >= 0.008 ether) && (msg.value < 0.016)) {
balances[msg.sender] += 13000;
} else balances[msg.sender] += 25000;
}
problem::
Die Bereitstellung dieses Vertrags funktioniert, aber Token werden nicht Adressen gutgeschrieben, die Ether an den Token-Vertrag senden.
Wie ändere ich den Vertrag, um das erwartete Verhalten zu erzeugen, und wie leite ich empfangene eth an eine externe Brieftasche weiter (dh etwas wie implementieren function withdraw() public onlyowner{}
)?
Ihr Vertrag enthält Fehler:
getAirdrop
der ersten Bedingung nach etwas zwischen 0 und 0,005 Ether gefragt wird, so dass Leute so viele Token erhalten können, wie sie wollen, indem sie dies oft anrufen und 0 Ether senden. Stattdessen können Sie zum Beispiel fragen:if((msg.value <= 0.003 ether) && (msg.value < 0.005 ether))
(msg.value < 0.008)
sollte (msg.value < 0.008 ether)
gleich sein für (msg.value < 0.016) was sein sollte (msg.value < 0.016 ether)Das Hinzufügen der getAirdrop
Funktion zum Fallback löst das Problem, Token im Austausch gegen Ether zu erhalten, und die Übertragung an den Eigentümer bringt den Ether an den Eigentümer des Vertrags.
Hier ist ein Beispiel, das hauptsächlich den von Ihnen bereitgestellten Code verwendet.
Beachten Sie , dass dies fehlschlägt, wenn der Absender des Ethers ein anderer Vertrag ist, da die transfer
Funktion nur mehr bereitstellt 2300 gas
und die getAirdrop
Funktion verbraucht.
pragma solidity ^0.4.24;
contract Airdrop {
mapping(address => uint256) public balances;
address public admin;
constructor() public {
owner = msg.sender;
}
function getAirdrop() public payable {
if (msg.value < 0.005 ether) {
balances[msg.sender] += 4000;
} else if ( (msg.value >= 0.005 ether) && (msg.value < 0.008 ether)) {
balances[msg.sender] += 9000;
} else if ( (msg.value >= 0.008 ether) && (msg.value < 0.016 ether)) {
balances[msg.sender] += 13000;
} else balances[msg.sender] += 25000;
}
function () payable public {
getAirdrop();
admin.transfer(msg.value);
}
}
Hoffe das hilft
Skope Martin
if (msg.value < 0.005 ether)
war jedoch beabsichtigt, da ich eine Art schwarze Liste innerhalb des Blocks implementieren möchte, um den Zugriff zu beschränken (z. B. erfordern, dass msg.sender nicht auf der schwarzen Liste steht, und nach dieser Behauptung zur schwarzen Liste hinzugefügt werden).