In the present article under consideration there are some vital user guidelines on compiling, deploying and managing the smart contracts of VU Token.
First of all, pay attention to such an important step as setting up your private key. If you have Ethereum address then you should have a wallet file (with a password). You can find an example in secrets.json
file in this repo. Copy and paste you private wallet file into secret.json, and also change the password in section main
in truffle.js
to the correct one:
main: {
network_id: 1,
provider: new HDWalletProvider(getWallet(), "password", 'https://mainnet.infura.io/'),
gas: 4700000,
gasPrice: 1000000000
}
NB! Do not use the default wallet file and password which are in the repo now. Change it instead. And do not forget that your personal key is private, do not share it and commit it in a public repo!
Install the Truffle development framework, which helps with smart contract creation, compiling, deployment and testing. Let’s start (again, you may need to prepend sudo
depending on your setup):
# Step 1
# First, let's install truffle
$ npm install -g truffle
Install ganache-cli and run it (you may need to prepend sudo
depending on your setup):
# Step 2
$ npm install -g ganache-cli
$ ganache-cli
You should be able to compile the example contracts by running
# Step 3
$ truffle compile
Then, to deploy the contracts to the simulated network using the ganache-cli
node we have running, you need to run
# Step 4
$ truffle migrate
Now, after the Step 4, our contracts are deployed in local ganache-cli
network. Let’s play with it! You can send messages to it via function calls and read its public state. We’ll use the Truffle console
for that:
# Step 5
$ ./node_modules/.bin/truffle console
truffle(development)> let owner = web3.eth.accounts[0];
truffle(development)> VUToken.deployed().then(l => l.balanceOf(owner))
Please note, at the present time, your contracts are in local network simulator. The previous steps are only have affect only on local network, whereas public ones are not changed.
Now you are prepared to deploy VUToken and Crowdsale contracts in Rinkeby testnet. Run truffle console
bash-3.2$ ./node_modules/.bin/truffle console --network rinkeby
And then
truffle(rinkeby)> compile
....
truffle(rinkeby)> migrate
....
Note that this time, it will take longer to complete, as we’re connecting to the actual network and not the one simulated by ganache-cli
. Once it is completed, you can interact with the contracts using the same approach as before, just remember to specify the target network by using --network
option.
Congratulation! Now you have VUToken
in Rinkeby
testnet.
Please test it carefully and save the artifacts from /build
folder for further usage.
There are also some useful code snippets which show how to perform basic operations with your contracts.
VUToken.deployed().then(t => t.balanceOf.call("your address here"))
VUToken.deployed().then(t => t.transfer("destination address", 1000)
where 1000 - number of tokens you want to send
If you have to transfer
tokens to multiple targets, there is a very useful function massTransfer
:
let token = await VUToken.deployed();
let target1 = ;
let tokens1 = ;
...
await token.massTransfer([target1,target2],[tokens1,tokens2]);
Whitelist
is a smart contract which holds a list of whitelisted users, the users who passed KYC.
PresaleCrowdsale
and ICOCrowdsale
have a shared whitelist
. So, the user who has been whitelisted during Presale,
will be automatically permitted to buy tokens during ICO as well. There is no need to add it twice, for Presale, and then for ICO.
How to interact with the WhiteList contract:
let whiteList = await Whitelist.deployed();
await whiteList.addToWhitelist(whitelistedAddress);
assert.isTrue(await whiteList.isWhitelisted(whitelistedAddress));
await whiteList.removeFromWhitelist(whitelistedAddress);
assert.isFalse(await whiteList.isWhitelisted(whitelistedAddress));
Returns id of the current phase: 0 - for the 1st Phase, 1 - for the 2nd one, and etc.
PresaleCrowdsale.deployed().then(p => p.getPhase())
Returns true
if presale is closed:
PresaleCrowdsale.deployed().then(p => p.hasClosed())
How to buy the tokens during presale:
PresaleCrowdsale.deployed().then(p => p.buyTokens(participant, {from: participant, value:value}));
where beneficiary
is an address performing the token purchase.
The same functions are available, except for getPhase
. ICO has no phases, there is only fixed rate.
- PresaleCrowdsaleTestable
- ICOCrowdsaleTestable
They have the same functionality as PresaleCrowdsale
and ICOCrowdsale
respectively.
But soft caps, hard caps, phase limits are reduced in 10^5 times. This allows to test all functionality and a whole presale/ico workflows even if a tester has only 1 ETH.
There is a special js script designed to be used for mass whitelisting:
$ truffle exec ./scripts/mass_whitelisting.js --data ./scripts/data.csv --batch_size 5
-
Deploy the contracts in mainnet (or testnet)
-
MARGE
should allow 150000000 tokens forPresaleCrowdsale
contract, see6_init_presale3.js
-
Wait for the openingTime
-
Presale, wait for the closingTime
-
Burn unsold tokens from MARGE wallet
-
MARGE
should allow 450000000 tokens forICOCrowdsale
contract, see8_init_ico.js
-
Wait for the openingTime
-
ICO, wait for the closingTime
-
Burn unsold tokens from MARGE wallet
-
Participants will be able to withdraw purchased tokens after deliveryDate
- openingTime: March 29, 2018 00:00:00
- closingTime: April 30, 2018 00:00:00
- deliveryTime: July 1, 2018 00:00:00;
See 5_deploy_presale.js
- openingTime: April 30, 2018 00:00:00
- closingTime: June 30, 2018 00:00:00
- deliveryTime: July 1, 2018 00:00:00
See 7_deploy_ico.js