¿Cómo puedo codificar un contrato de crowdsale para enviar todos los tokens no vendidos a una dirección específica?

Según mi comprensión de los contratos inteligentes, parecería que no hay forma de establecer una función o acción específica para que se active después de un tiempo determinado, ¿es este el caso?

¿Es la única forma de asignar tokens no vendidos establecer una función que lo haga y luego llamar a esa función manualmente al finalizar la fecha de finalización de ICO?

No puedo encontrar ninguna implementación de este tipo de cosas, pero seguramente es un método común dentro de las ICO. El contrato "FinalizeAgent" de OpenZeppelins no es de ayuda, ya que no explica cómo se activa.

Gracias.

Respuestas (3)

¿Ha pensado en usar un token [mintable] ( https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC20/MintableToken.sol )? Entonces no habría tokens sin vender de los que preocuparse por quemar 😉

Pero, si no puedes hacer eso.

Entonces sí, tiene razón en que un contrato inteligente no puede activarse para hacer algo, ya que eso requeriría algún tipo de bucle. ¿Y se imagina lo jodido que sería el EVM si todos los contratos inteligentes estuvieran en bucle esperando que ocurra un evento basado en el tiempo? No bueno. No solo eso, los contratos inteligentes no pueden pagar los costos del gas (IIRC que está en proceso o es un EIP)

Respuesta directa:

function burnTokens() public onlyOwner onlyCrowdsaleOver {
    address(0).transfer(remainingTokens);
}

Tiene razón al decir que no hay forma de configurar una acción para que se active después de un período de tiempo específico por sí misma. Tiene que haber una transacción que haga eso.

La transacción podría desencadenar una función como esta.

function burnTokensAfterSale() {
    if (finalized && (block.number > 6000000)) {
        _transfer(0, remainingTokens)
    }
}

Existe la nowpalabra clave en ethereum que es igual a una marca de tiempo.

¿Por qué no usas algo como:

    if(now > 1500000)
    {
       sendTo(0x123456789213456789123456789);
    }
Pero, ¿no tendría que estar dentro de una función que luego se llamará después de que finalice la venta masiva? ¿Llamar a una función a través de la dirección del propietario es la forma aceptada de implementar esto? Gracias por tu ayuda.
ethereum.org/crowdsale Mire el ejemplo, aquí la verificación es llamada por un modificador cada vez que se llama a una función.