I would like to call token.transferOwnership(msg.sender) after finishing timed crowdsale. So, I inherited FinalizableCrowdsale contract, then override finalization() function to call transferOwnership on the crowdsale contract.
Actually, I can test to call crowdsale.finalize() on Truffle console and it is working well, but I don't know how to call the function automatically after finishing crowdsale. When crowdsale started, the token ownership has been transferred to crowdsale contract. Um, Do I have to modify hasClosed() function in TimedCrowdsale? or is there any way to call the fucntion...?
I tried to call it on Etherscan after verifying the code, but I couldn't do cos the crowdsale contract has the ownership...
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)
});
});
};
Crowdsale Contract.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();
}
}