¿El contrato de token debe transferir todos los tokens al contrato de venta colectiva antes de que pueda venderlos?

Observo que en las pruebas estándar para contratos de venta colectiva en Openzeppelin, transfieren los tokens del contrato Token al Contrato Crowdsale:

context('once deployed', async function () {
      beforeEach(async function () {
        this.tokensale = await TokenSale.new(rate, wallet, this.token.address);
        await this.token.transfer(this.tokensale.address, tokenSupply);
      });

Sin embargo , otros ejemplos no hacen esto. Entonces me pregunto por qué esto es necesario, si internamente el CrowdSalecontrato usa el contrato de token para enviar los tokens:

function _deliverTokens(
        address beneficiary,
        uint256 tokenAmount
    )
    internal
    {
        _token.safeTransfer(beneficiary, tokenAmount);
    }

En la función anterior _tokenestá la interfaz IERC20 del contrato Token. ¿Puede alguien explicar esto un poco mejor que esta página ?

Respuestas (1)

No es necesario enviar todos los tokens a un contrato de venta colectiva en el momento de la creación. Puede hacer lo que mejor se adapte a su modelo de negocio.

Por ejemplo, un escenario común es vender el 25 % de los tokens en la venta y retener el resto. En este caso, creará el 25 % de los tokens en el contrato de venta colectiva y el 75 % en su propia billetera.

El contrato anterior entrega los tokens, como se esperaba. _token.safeTransfer(beneficiary, tokenAmount);está diciendo que este contrato transferirá tokens de este contrato al beneficiario. La clave de esta afirmación es que los tokens viven en el contrato de crowdsale, o de lo contrario safeTransfer()se lanzarán. Como mencionaste, _tokenes la interfaz IERC20 para el contrato.

La prueba a la que hizo referencia es una beforeEachfunción que restablece los contratos antes de cada prueba. Esta es simplemente una forma conveniente de completar un contrato con tokens para probar. Las pruebas escritas para este código son específicas para la distribución de tokens, por lo que es factible enviar todos los tokens.