Contrato inteligente de venta directa, ¿funciona sin problemas de seguridad?

Quiero hacer una página para la venta directa de mi token, como la de Loomx , con un precio de token fijo (cambiable más tarde por mí) e inmediatamente transferir el token al comprador de forma segura después de la compra.

Intento "robar" su contrato inteligente, pero no está verificado ni es público. Cuando intento buscar en línea, la mayoría son Crowdsale , lo que parece ser demasiado complicado.

También encontré una biblioteca de venta directa de corwdsale , pero parece que no se usa mucho.

Aquí está mi código, que es muy simple:

pragma solidity ^0.4.24;

import 'http://github.com/OpenZeppelin/openzeppelin-solidity/contracts/ownership/Ownable.sol';
import 'http://github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol';

contract Directsale is Ownable {

    uint public tokensPerEther;
    ERC20 public token;
    bool public saleClosed = false;

    event FundTransfer(address backer, uint amount);

    constructor (
        uint tokenPerEachEther,
        address tokenAddress
    ) public {
        tokensPerEther = tokenPerEachEther * 1 ether;
        token = ERC20(tokenAddress);
    }

    function closeSale() external onlyOwner {
        saleClosed = true;
    }

    function setTokenPrice(uint tokenPerEachEther) external onlyOwner {
       tokensPerEther  = tokenPerEachEther * 1 ether;
    }

    function () payable public {
        require(!saleClosed);
        require(msg.value > 0);
        uint amount = msg.value;
        token.transfer(msg.sender, amount * tokensPerEther);
        emit FundTransfer(msg.sender, amount);
    }

}

¿Estaría bien y no causaría ningún problema de seguridad?

Y, ¿hay algún buen ejemplo de código abierto que incluya web3 javascript con el que pueda estudiar?

Respuestas (1)

Solo una respuesta rápida a mi propia pregunta, resultó que usé CappedCrowdsale.sol y AllowanceCrowdsale.sol de OpenZeppelin . Debería ser lo suficientemente seguro y estable, mi código final está aquí:

pragma solidity ^0.4.24;

import 'openzeppelin-solidity/contracts/crowdsale/emission/AllowanceCrowdsale.sol';
import 'openzeppelin-solidity/contracts/crowdsale/validation/CappedCrowdsale.sol';
import "openzeppelin-solidity/contracts/ownership/HasNoTokens.sol";

contract CubikCrowdsale is CappedCrowdsale, AllowanceCrowdsale, HasNoTokens {

  event RateChange(uint256 amount);

  constructor (uint256 _rate, address _wallet, ERC20 _token, uint256 _cap) public Crowdsale(_rate, _wallet, _token) CappedCrowdsale(_cap) AllowanceCrowdsale(_wallet) {
  }

  function setRate(uint256 _rate) external onlyOwner {
    rate = _rate;
    emit RateChange(_rate);
  }

}

Para la interfaz de Web3, no pude encontrar un buen ejemplo completo y finalmente escribí uno propio aquí .