Initial Coin Offering with Truffle and Zeppelin Solidity contracts
First of all you should install truffle.
npm truffle i -g
npm truffle init
Then init npm and install zeppelin-solidity.
npm init
npm i zeppelin-solidity
Also you need a test network. I am using Ganache. You can install and run it on your computer. In truffle.js file add this connection.
host: "localhost", port: 7545
In ./contracts folder there are two custom files: ExampleToken.sol and ExampleCrowdsale.sol. ExampleToken.sol is a smart contract of a coin. As you see it is burnable, pausable, mintable token with reclaim function and whitelist owners.
import "zeppelin-solidity/contracts/token/ERC20/MintableToken.sol"; import "zeppelin-solidity/contracts/token/ERC20/PausableToken.sol"; import "zeppelin-solidity/contracts/token/ERC20/BurnableToken.sol"; import "zeppelin-solidity/contracts/ownership/CanReclaimToken.sol"; import "zeppelin-solidity/contracts/ownership/Whitelist.sol"; contract ExampleToken is Whitelist, CanReclaimToken, BurnableToken, PausableToken, MintableToken { string public name = "EXAMPLE COIN"; string public symbol = "EEC"; uint8 public decimals = 18; ... }
ExampleCrowdsale.sol is a smart contract of a crowdsale. It is minted, refundable crowdsale with min and max cap, min purchase, pre-sale and sale time and rate.
import "zeppelin-solidity/contracts/crowdsale/emission/MintedCrowdsale.sol"; import "zeppelin-solidity/contracts/crowdsale/validation/CappedCrowdsale.sol"; import "zeppelin-solidity/contracts/crowdsale/distribution/RefundableCrowdsale.sol"; contract ExampleCrowdsale is CappedCrowdsale, RefundableCrowdsale, MintedCrowdsale { ... function ExampleCrowdsale ( uint256 _openingTime, uint256 _preSaleTime, uint256 _saleTime, uint256 _closingTime, uint256 _preSaleRate, uint256 _saleRate, uint256 _finalRate, uint256 _minPurchase, uint256 _cap, uint256 _goal, address _wallet, MintableToken _token ) ... }
Also you should look into ./migrations/2_deploy_contracts.js file. There is defined all needed parameters for deploying.
const openingTime = web3.eth.getBlock('latest').timestamp + 5; // five seconds in the future const preSaleTime = openingTime + 86400 * 7; // 7 days | const saleTime = preSaleTime + 86400 * 21; // 21 days | } 35 days const closingTime = saleTime + 86400 * 7; // 7 days | const preSaleRate = new web3.BigNumber(1000); // 0.001 ETH per 1 token const saleRate = new web3.BigNumber(100); // 0.01 ETH per 1 token const finalRate = new web3.BigNumber(10); // 0.1 ETH per 1 token const minPurchase = web3.toWei('0.001', 'ether'); // min purchase is 0.001 ETH const cap = web3.toWei('100000', 'ether'); // cap is 100 thousand ETH const goal = web3.toWei('10000', 'ether'); // goal is 10 thousand ETH const wallet = accounts[0];
You just need to enter this truffle commands to deploy the contracts.
truffle compile
truffle migrate