Wie kann ich unterschiedliche Ether-/Token-Beträge im Token-Vertrag akzeptieren/ausgeben?

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{})?

Antworten (1)

Ihr Vertrag enthält Fehler:

  1. Leute, die nichts senden, erhalten immer noch Token, weil in getAirdropder 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))

  1. (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 getAirdropFunktion 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 transferFunktion nur mehr bereitstellt 2300 gasund die getAirdropFunktion 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

Danke, mit kleinen Modifikationen hat das funktioniert, um beide Probleme zu lösen. 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).