Skip to content

Instantly share code, notes, and snippets.

@tomconte
Created December 13, 2016 09:32
Show Gist options
  • Select an option

  • Save tomconte/4edb83cf505f1e7faf172b9252fff9bf to your computer and use it in GitHub Desktop.

Select an option

Save tomconte/4edb83cf505f1e7faf172b9252fff9bf to your computer and use it in GitHub Desktop.
Compiling and deploying an Ethereum Smart Contract, using solc and web3.
const fs = require('fs');
const solc = require('solc');
const Web3 = require('web3');
// Connect to local Ethereum node
const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
// Compile the source code
const input = fs.readFileSync('Token.sol');
const output = solc.compile(input.toString(), 1);
const bytecode = output.contracts['Token'].bytecode;
const abi = JSON.parse(output.contracts['Token'].interface);
// Contract object
const contract = web3.eth.contract(abi);
// Deploy contract instance
const contractInstance = contract.new({
data: '0x' + bytecode,
from: web3.eth.coinbase,
gas: 90000*2
}, (err, res) => {
if (err) {
console.log(err);
return;
}
// Log the tx, you can explore status with eth.getTransaction()
console.log(res.transactionHash);
// If we have an address property, the contract was deployed
if (res.address) {
console.log('Contract address: ' + res.address);
// Let's test the deployed contract
testContract(res.address);
}
});
// Quick test the contract
function testContract(address) {
// Reference to the deployed contract
const token = contract.at(address);
// Destination account for test
const dest_account = '0x002D61B362ead60A632c0e6B43fCff4A7a259285';
// Assert initial account balance, should be 100000
const balance1 = token.balances.call(web3.eth.coinbase);
console.log(balance1 == 1000000);
// Call the transfer function
token.transfer(dest_account, 100, {from: web3.eth.coinbase}, (err, res) => {
// Log transaction, in case you want to explore
console.log('tx: ' + res);
// Assert destination account balance, should be 100
const balance2 = token.balances.call(dest_account);
console.log(balance2 == 100);
});
}
@ar412
Copy link
Copy Markdown

ar412 commented Jul 5, 2017

I have Token.sol that it is referring to.
When deployed with node it is giving error:

Error: Cannot find module 'web3'

And with npm
TypeError: Cannot read property 'bytecode' of undefined

@ar412
Copy link
Copy Markdown

ar412 commented Jul 5, 2017

@base698 Can you help me out?

@themandalore
Copy link
Copy Markdown

For those wondering how to run this:

https://github.com/ethereum/web3.js/

open a command prompt or terminal and type node....then all of the commands should work

@duanyytop
Copy link
Copy Markdown

The problem can be resolved by changing the name of Token. If you print the json string ,you will find the property of 'Token' should be ':Token'. So just change '[Token]' to '[:Token]'. Best wishes!

@streamerd
Copy link
Copy Markdown

streamerd commented Jan 3, 2018

Hi all, I am currently having a TypeError;
...

$ node app.js

TypeError: web3.eth.contract is not a function
at Object. (/Users/foo/Developer/btc/contracts/app.js:15:27)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Function.Module.runMain (module.js:441:10)
at startup (node.js:139:18)
at node.js:974:3

--
node -v : v4.6.0
npm -v : 2.15.9
on OSX : 10.12.6 (Sierra)

@streamerd
Copy link
Copy Markdown

streamerd commented Jan 3, 2018

I've changed the code a little bit, seems we need to use 'Contract'' instead of 'contract' while instance generation.

// app.js
// Deploy contract instance

const abi = JSON.parse(output.contracts[':Token'].interface);
const contract = new web3.eth.Contract(abi, '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', {
    data: '0x' + bytecode,
    from: web3.eth.coinbase,
    gas: 90000*2
}, (err, res) => {
    if (err) {
        console.log(err);
        return;
    }

now there is no error back.
I've referenced from https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html for the address 0x..BAe

@VanThanh1812
Copy link
Copy Markdown

VanThanh1812 commented Apr 12, 2018

Anyone can help me, when I use solc and build in webpack, I get error: Uncaught TypeError: Cannot read property 'prototype' of undefined
at patch (graceful-fs.js:166) and load web fail? Thank you

@ADitya024
Copy link
Copy Markdown

ADitya024 commented Apr 19, 2018

Hello guys,
I am facing a error : TypeError: Cannot read property 'bytecode' of undefined
occuring on line : const bytecode = output.contracts['Token'].bytecode;

@gulfcoastdev
Copy link
Copy Markdown

@ADitya024
Change it to:
output.contracts['Token']["bytecode"];

@shchye95
Copy link
Copy Markdown

Hi guys,

I am currently trying to adopt this source code for my school project. But may I know what is the folder structure for this project? Because I can't seemed to grasp how the code retrieve the Token.sol (Line 9)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment