Implementación de un Crowdsale de Subsidios. Interfaz de token / _prevalidatePurchase-/_delivertokens-function

Soy nuevo en la codificación de solidez y después de crear algunos contratos básicos, así como un contrato de token ERC20, quería crear un contrato de venta colectiva. Ahora estoy atascado y tengo una pregunta sobre la implementación de un contrato de venta colectiva de subsidios utilizando los contratos de OpenZeppelin.

Aquí está el código que agregué después de importar SafeMath, Ownable, ERC20Basic, ERC20, Crowdsale, WhitelistedCrowdsale, AllowanceCrowdsale, CappedCrowdsale, TimedCrowdsale:

contract TestToken is ERC20 {
    using SafeMath for uint256;

    string public symbol = "TEST";
    string public name = "TEST Token";
    uint8 public decimals = 18;
    uint256 public _totalSupply = 140000000 * 10**uint256(decimals);
}


contract TestCrowdsale is Crowdsale, WhitelistedCrowdsale, AllowanceCrowdsale, CappedCrowdsale, TimedCrowdsale
{
function TestCrowdsale(
    uint256 _openingTime,
    uint256 _closingTime,
    uint256 _rate,
    address _wallet,
    address _tokenWallet,
    uint256 _cap,
    TestToken _token
    )
    public
    Crowdsale(_rate, _wallet, _token)
    AllowanceCrowdsale(_tokenWallet)
    CappedCrowdsale(_cap)
    TimedCrowdsale(_openingTime, _closingTime)
    {
    }
}

Mis preguntas...

P1: ¿Dónde ingreso la dirección del contrato de token si quiero usar un token que se creó antes del contrato de venta colectiva?

P2: Si no puedo ingresarlo en ningún lugar directamente, ¿cómo defino la interfaz del token en el contrato de venta colectiva? Lo intenté de la misma manera que se muestra en el contrato de crowdsale de ejemplo que usa un Token acuñado, pero falló.

P3: Si las dos opciones mencionadas son incorrectas, ¿tengo que crear el Token y el crowdsale en un solo paso?

P4: ¿Tengo que cambiar algo en los contratos importados, por ejemplo, debido al uso múltiple de las funciones _prevalidatePurchase o _deliverTokens?

Muchas gracias de antemano por tu ayuda.

Respuestas (1)

Sé que ya han pasado 3 meses, pero la respuesta puede ser útil para otros. Cuando llegué aquí sabía parte de la respuesta, así que déjame responderla por completo. Permítanme primero responder a sus preguntas:

Q1. En el constructor TestCrowdsale, el campo TestToken _tokendebe ser la dirección del contrato del token

Q2. ¡Puede!

Q3. Un "hace mucho tiempo", así funcionaba esto, pero cambió... ya tienes tu respuesta.

Q4. No, mira estos contratos como clases de Java. El crowdsale es el más básico, y los demás lo amplían, y en ocasiones anulan métodos como el _deliverTokensmétodo. En este caso, AllowanceCrowdsale anula estos métodos, pero MintedCrowdsale también lo hace.

Creo que respondió a sus preguntas. Ahora, lo que te falta es cómo implementar esos contratos.
Bueno, hay algunos métodos, pero déjame decirte que usar Truffle es la forma más fácil.
Ya que hice esto recientemente, déjame mostrarte cómo se hace.

var YourCrowdsale = artifacts.require("./YourCrowdsale.sol");
var YourCoin = artifacts.require("./YourCoin.sol");

module.exports = function(deployer, network, accounts) {
    deployer.then(() => {
        return deployer.deploy(YourCoin);
    })
    .then(() => {
        var rate = 1;
        var wallet = accounts[0];
        return deployer.deploy(YourCrowdsale, rate, wallet, wallet, YourCoin.address);
    });
};

Esto se llama un archivo de migraciones en trufa (solo eche un vistazo a su sitio web). Una nota importante, se hizo con Truffle v4 , el v5 se lanzó unos días y corrigió algunos errores, incluida la necesidad de usar deployment.then().then() .... (hubo un error en v4 que no permitía implementar contratos dentro de promesas, así que ese era el truco).

Ahora, lo último importante, si está utilizando Open-Zeplin, debe transferir la propiedad de los contratos, como este YourCoinInstance.transferOwnership(YourCrowdsaleInstance.address);. En caso de que esté utilizando MintableCrowdsale, es suficiente, puede comenzar a minar, en este caso, también debe aprobar la transferencia de tokens, como YourCoinInstance.approve(YourCrowdsaleInstance.address, web3.toWei(ammountOfTokens, 'ether'));.