This tutorial will show you how to deploy a solidity contract to Ropsten (Test Net).
Setup
Installing node and npm, here is a great tutorial but most of you should already have this setup
Install web3 and solc.
npm install -g web3 solc fs
Register with https://infura.io
Endpoint
get test eth http://faucet.bitfwd.xyz/
Possible issues
Error: Cannot find module ‘web3’
Could be that you not adding the node modules to your path
export NODE_PATH=/home/plouw/.node_modules_global/lib/node_modules
Make use of the OpenZeppelin expectThrow script
export default async promise => {
try {
await promise ;
} catch ( error ) {
// TODO: Check jump destination to destinguish between a throw
// and an actual invalid jump.
const invalidOpcode = error . message . search ( ' invalid opcode ' ) >= 0 ;
// TODO: When we contract A calls contract B, and B throws, instead
// of an 'invalid jump', we get an 'out of gas' error. How do
// we distinguish this from an actual out of gas event? (The
// ganache log actually show an 'invalid jump' event.)
const outOfGas = error . message . search ( ' out of gas ' ) >= 0 ;
const revert = error . message . search ( ' revert ' ) >= 0 ;
assert (
invalidOpcode || outOfGas || revert ,
' Expected throw, got \' ' + error + ' \' instead ' ,
);
return ;
}
assert . fail ( ' Expected throw not received ' );
};
In my test I have added that code to file in my test folder /helpers/expectThrow.js and have used as follow. Here the function getPeriodStartTimestamp is expected to throw when the value is 50000 or larger.
// Import the helper script
import expectThrow from ' ./helpers/expectThrow ' ;
const PeriodUtilWeek = artifacts . require ( " ./PeriodUtilWeek.sol " );
const BigNumber = web3 . BigNumber ;
contract ( ' PeriodUtilWeek ' , function ( accounts ) {
// Other tests
describe ( ' Test getPeriodStartTimestamp (Week) ' , async function () {
beforeEach ( async function () {
this . periodUtilWeek = await PeriodUtilWeek . new ();
});
it ( ' Test exception ' , async function () {
// Magic bit here!
await expectThrow ( this . periodUtilWeek . getPeriodStartTimestamp ( new BigNumber ( ' 50000 ' )));
});
});
// Loads more tests
}
Fun Issue
Unexpected token import
! This is because we need some Babel
/ home / mmmmmm / dev / Project / solidityWork / profit / test / period_util_week . js : 1
( function ( exports , require , module , __filename , __dirname ) { import expectThrow from ' ./helpers/expectThrow ' ;
^^^^^^
SyntaxError : Unexpected token import
at createScript ( vm . js : 80 : 10 )
at Object . runInThisContext ( vm . js : 139 : 10 )
at Module . _compile ( module . js : 616 : 28 )
at loader ( /home/mmmmmm / dev / Project / solidityWork / profit / node_modules / babel - register / lib / node . js : 144 : 5 )
at Object . require . extensions .( anonymous function ) [ as . js ] ( /home/mmmmmm / dev / Project / solidityWork / profit / node_modules / babel - register / lib / node . js : 154 : 7 )
at Module . load ( module . js : 565 : 32 )
at tryModuleLoad ( module . js : 505 : 12 )
at Function . Module . _load ( module . js : 497 : 3 )
at Module . require ( module . js : 596 : 17 )
at require ( internal / module . js : 11 : 18 )
at / home / mmmmmm / . node_modules_global / lib / node_modules / truffle / node_modules / mocha / lib / mocha . js : 231 : 27
at Array . forEach ( < anonymous > )
at Mocha . loadFiles ( /home/mmmmmm / . node_modules_global / lib / node_modules / truffle / node_modules / mocha / lib / mocha . js : 228 : 14 )
at Mocha . run ( /home/mmmmmm / . node_modules_global / lib / node_modules / truffle / node_modules / mocha / lib / mocha . js : 536 : 10 )
at / home / mmmmmm / . node_modules_global / lib / node_modules / truffle / build / webpack : /~ /truffle-core/ lib / test . js : 125 : 1
at < anonymous >
at process . _tickCallback ( internal / process / next_tick . js : 188 : 7 )
To fix this add the following dependencies by editing package.json and adding under “devDependencies” the following
"babel-polyfill" : "^6.23.0" ,
"babel-preset-es2015" : "^6.18.0" ,
"babel-preset-stage-2" : "^6.18.0" ,
"babel-preset-stage-3" : "^6.17.0" ,
Running npm install in the project directory to install the new packages
npm install
Create a new file in the project directory call .babelrc
and put the following in there
{
"presets" : [ "es2015" , "stage-2" , "stage-3" ]
}
Now when you run the truffle test
all should work again without a error
Update (2018-06-11)
Code coverage will stop working with same issue SyntaxError: Unexpected token import
. To fix this add a network coverage to the truffle.js, see below example:
require('babel-register');
require('babel-polyfill');
module.exports = {
// See <http://truffleframework.com/docs/advanced/configuration>
// to customize your Truffle configuration!
networks: {
mainnet: {
host: 'localhost' ,
port: 8545 ,
network_id: ' 1 ' , // Match any network id
gas: 3500000 ,
gasPrice: 10000000000
},
development: {
host: "localhost" ,
port: 7545 ,
network_id: "*" , // Match any network id
gas: 4500000 ,
},
coverage: {
host: "localhost" ,
port: 7545 ,
network_id: "*" , // Match any network id
gas: 4500000 ,
},
ropsten : {
host: "127.0.0.1" ,
port: 8545 ,
network_id: "3" , // Match any network id
gas: 4500000 ,
}
},
dependencies: {},
solc: {
optimizer: {
enabled: true ,
runs: 200 ,
},
},
} ;