(Truffle) cómo llamar a la función finalizar () después de terminar crowdsale

Me gustaría llamar token.transferOwnership(msg.sender)después de terminar el crowdsale cronometrado. Entonces, heredé el contrato FinalizableCrowdsale, luego anulé finalization()la función para invocar transferOwnershipel contrato de venta colectiva.

En realidad, puedo probar para llamar crowdsale.finalize()a la consola Truffle y funciona bien, pero no sé cómo llamar a la función automáticamente después de finalizar la venta masiva . Cuando comenzó el crowdsale, la propiedad del token se transfirió al contrato de crowdsale. Um, ¿tengo que modificar hasClosed()la función en TimedCrowdsale? o hay alguna forma de llamar a la función...?

Traté de llamarlo en Etherscan después de verificar el código, pero no pude hacerlo porque el contrato de venta colectiva tiene la propiedad...

Crowdsale Migration.js

const DappToken = artifacts.require("./DappToken.sol");
const DappTokenCrowdsale = artifacts.require('DappTokenCrowdsale');

const ether = (n) => new web3.BigNumber(web3.toWei(n, 'ether'));

const duration = {
    seconds: function (val) { return val; },
    minutes: function (val) { return val * this.seconds(60); },
    hours: function (val) { return val * this.minutes(60); },
    days: function (val) { return val * this.hours(24); },
    weeks: function (val) { return val * this.days(7); },
    years: function (val) { return val * this.days(365); },
  };

// module.exports = function(deployer, network, accounts) {
module.exports = function(deployer, network, accounts) {
    const latestTime = Math.floor(Date.now() / 1000);
    const _token = DappToken.address;
    const _rate = 1000;

    const _wallet = accounts[3]; // Collecting Wallet
    const _openingTime = latestTime + duration.minutes(1);
    const _closingTime = _openingTime + duration.minutes(2);
    const _cap = ether(100);

    console.log("Open: " + new Date(_openingTime*1000) + " Close: " + new Date(_closingTime*1000));

    return deployer.deploy(DappTokenCrowdsale, _rate, _wallet, _token, _cap, _openingTime, _closingTime)
        .then(() => {
            return DappToken.deployed().then((token) => {
                return token.transferOwnership(DappTokenCrowdsale.address)
            });
        });
};

Contrato Crowdsale.sol

pragma solidity 0.4.24;

import "./DappToken.sol";

import "../node_modules/openzeppelin-solidity/contracts/crowdsale/Crowdsale.sol";
import "../node_modules/openzeppelin-solidity/contracts/crowdsale/emission/MintedCrowdsale.sol";
import "../node_modules/openzeppelin-solidity/contracts/crowdsale/validation/CappedCrowdsale.sol";
import "../node_modules/openzeppelin-solidity/contracts/crowdsale/validation/TimedCrowdsale.sol";
import "../node_modules/openzeppelin-solidity/contracts/crowdsale/distribution/FinalizableCrowdsale.sol";
// import "../node_modules/openzeppelin-solidity/contracts/crowdsale/validation/WhitelistedCrowdsale.sol";

contract DappTokenCrowdsale is Crowdsale, MintedCrowdsale, CappedCrowdsale, TimedCrowdsale, FinalizableCrowdsale {
    MintableToken public token;
    address public tokenAddress;
    address public crowdsaleOwner;
    address public founderWallet;

    bool public isFinalized = false;

    constructor(
      uint256 _rate,
      address _wallet,
      MintableToken _token,
      uint256 _cap,
      uint256 _openingTime,
      uint256 _closingTime
    )
    Crowdsale(_rate, _wallet, _token)
    CappedCrowdsale(_cap)
    TimedCrowdsale(_openingTime, _closingTime)
    FinalizableCrowdsale()
    MintedCrowdsale()
    public
    {
      founderWallet = _wallet;
      token = _token;          
    }

    function finalization() internal {
      token.transferOwnership(msg.sender);
      super.finalization();
    }
}

Respuestas (2)

automáticamente después de terminar crowdsale

no es posible ejecutar la función de contrato inteligente automáticamente literalmente

para llamar a finalizela función después de un período de tiempo, puede:

Agregue la siguiente función:

function finalizeIfNeeded () internal {
    if (!finalized && block.timestamp >= crowdsaleEndTime) {
        finalization ();
        finalized = true;
    }
}

y llámelo al comienzo de todas sus funciones públicas no constantes cuyo comportamiento depende de si la venta multitudinaria finaliza o no.

Si tiene algunas viewfunciones constantes (p. ej.) cuyo comportamiento también depende del estado de finalización, agregue la siguiente función:

function isFinalized () view returns (bool) {
    return finalized || block.timestamp >= crowdsaleEndTime;
}

y utilícelo en su función constante para verificar si la venta masiva está finalizada.