How to compile Solidity ^0.5.5 contract with Node.js?

by Joanmacat   Last Updated March 14, 2019 18:28 PM

I am terribly new in Solidity and now I try to learn how to compile a contract in Solidity ^0.5.5 (No versions below).

I have the contract as follow (UsersContract.sol)

pragma solidity ^0.5.5;

contract UsersContract {

    struct User {
        string name;
        string surname;
    }
    mapping(address => User) private users;
    mapping(address => bool) private joinedUsers;
    address[] total;
    event OnUserJoined(address, string);

    function join(string memory name, string memory surname) public {
        require(!userJoined(msg.sender));
        User storage user = users[msg.sender];
        user.name = name;       
        user.surname = surname;
        joinedUsers[msg.sender] = true;
        total.push(msg.sender);

        emit OnUserJoined(msg.sender, string(abi.encodePacked(user.name, " 
    ", user.surname)));
}

    function getUser(address addr) public view returns (string memory, 
string memory) {
        require(userJoined(msg.sender));
        User memory user = users[addr];
        return (user.name, user.surname);   
}

    function userJoined(address addr) private view returns (bool){
        return joinedUsers[addr];
    } 

    function totalUsers() public view returns (uint){
        return total.length;
    }
}

Next the compilator called (compile.js):

const path = require('path'); 
const fs = require('fs'); 
const solc = require('solc');

const contractPath = path.join(__dirname,'../contracts','UsersContract.sol');
const source = fs.readFileSync(contractPath, 'UTF-8');

const input = {
    language: 'Solidity',
    sources: {
        'UsersContract.sol': {
            content: source
        }
    },

    settings: {
        outputSelection: {
            '*': {
                '*': [ '*' ]
            }
        }
    }
}   

function findImports (path) {
    if (path === 'UsersContract.sol')
        return { contents: source }
    else
        return { error: 'File not found' }
}

const output = JSON.parse(solc.compile(JSON.stringify(input), findImports));

And finally the file where I execute the tests before to run them (UsersContract.test.js)

const assert = require('assert');
const Web3 = require('web3');
const provider = new Web3.providers.HttpProvider("HTTP://127.0.0.1:7545"); // GANACHE RPC SERVER
const web3 = new Web3(provider);
const { interface, bytecode } = require('../contracts/compile.js');


let accounts;
let usersContract;

beforeEach(async() => {

    accounts = await web3.eth.getAccounts();        
    usersContract = await new web3.eth.Contract(JSON.parse(interface))
        .deploy({ data: bytecode })
        .send({ from: accounts[1], gas: 1000000});

});

describe('The UsersContract', async() => {

    it('should deploy', () => {
        console.log(usersContract.options.address); 
        assert.ok(usersContract.options.address); 
    });

});

The main problem is, everytime I execute npx mocha to try the test I get the next error:

The UsersContract
    1) "before each" hook for "should deploy"


  0 passing (59ms)
  1 failing

  1) "before each" hook for "should deploy":
     SyntaxError: Unexpected token u in JSON at position 0
      at JSON.parse (<anonymous>)
      at Context.beforeEach (test/UsersContract.test.js:24:54)
      at <anonymous>
      at process._tickCallback (internal/process/next_tick.js:182:7)

Any help? Any idea? I don't know where or what I am doing wrong right now.

PD: I let here the package.json information. Hope it helps.

{
  "name": "compile-and-deploy",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "mocha"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {},
  "devDependencies": {
    "mocha": "^5.2.0",
    "solc": "^0.5.5",
    "web3": "^1.0.0-beta.35"
  }
}


Related Questions