¿Cómo aceptar/emitir cantidades variables de Ether/token en un contrato de token?

Estoy tratando de crear un contrato de token erc827 que acepte cantidades variables de éter (0 para airdrop, 0.001, 0.002 >> para donaciones.

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::

La implementación de este contrato funciona, pero los tokens no se acreditan a las direcciones que envían ether al contrato de token.


¿Cómo modifico el contrato para producir el comportamiento esperado y cómo reenvío los eth recibidos a una billetera externa (es decir, implementando algo como function withdraw() public onlyowner{})?

Respuestas (1)

Su contrato tiene errores:

  1. Las personas que no envíen nada seguirán recibiendo tokens porque en getAirdropel primer condicional solicitan cualquier cosa entre 0 y 0.005 ether, por lo que las personas pueden obtener tantos tokens como quieran simplemente llamando esto muchas veces y enviando 0 ether. En su lugar, puede preguntar por ejemplo:

if((msg.value <= 0.003 ether) && (msg.value < 0.005 ether))

  1. (msg.value < 0.008)debería ser el (msg.value < 0.008 ether)mismo para (msg.value < 0.016) que debería ser (msg.value < 0.016 ether)

Agregar la getAirdropfunción al respaldo resolverá el problema de obtener tokens a cambio de ether y luego transferirlo al propietario hará que el ether llegue al propietario del contrato.

Aquí hay un ejemplo que usa principalmente el código que proporcionó.

Tenga en cuenta que esto fallará si el remitente de ether es otro contrato porque la transferfunción solo proporciona 2300 gasy la getAirdropfunción consume más que eso.

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);
    }


}

Espero que esto ayude

Gracias, con pequeñas modificaciones, que funcionó para resolver ambos problemas. if (msg.value < 0.005 ether)sin embargo, fue intencional ya que estoy buscando implementar algún tipo de lista negra dentro del bloque para limitar el acceso (como, requerir que msg.sender no esté en la lista negra y luego agregar a la lista negra después de ese reclamo).