Search code examples
javascriptblockchainethereumsolidityweb3js

How can get json interface of the smart contract


I export JSON interface from compile.js file but deploy.js file not work it shows error as

RuntimeError: abort(Error: You must provide the JSON interface of the contract when instantiating a contract object.). Build with -s ASSERTIONS=1 for more info.

here is compile.js

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

const lotteryPath = path.resolve(__dirname, 'contracts', 'lottery.sol');
const source = fs.readFileSync(lotteryPath, 'utf-8');

//console.log(solc.compile(source,1));


var input = JSON.stringify({
    language: 'Solidity',
    sources: {
        'lottery.sol': {
            content: source
        }
    },
    settings: {
        outputSelection: {

            // Enable the metadata and bytecode outputs of every single contract.
            "*": {
                "*": ["metadata", "evm.bytecode"]
            },
            // Enable the abi and opcodes output of MyContract defined in file def.
            "def": {
                "Lottery": ["abi"]
            },
           


        }
    }
})

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

const interface = output.contracts['lottery.sol'].Lottery.abi;
const bytecode = output.contracts['lottery.sol'].Lottery.evm.bytecode.object;

module.exports = {
    interface,
    bytecode,
};

after that export this to deploy.js file

 
const HDwalletProvider = require("truffle-hdwallet-provider");
const Web3 = require("web3");
const {interface,bytecode}= require('./compile.js');


const provider = new HDwalletProvider(
    '',
    'https://ropsten.infura.io/v3/9ba5113757f648aaaab4d53e65898119'
);

const web3 = new Web3(provider);

const deploy = async()=>{
    const accounts = await web3.eth.getAccounts();
    console.log(accounts);
    console.log("contract is deployed by manager with address",accounts[0]);

    const result = await new web3.eth.Contract(interface)
     .deploy({data : '0x'+bytecode})
     .send({gas : '2000000' , from : accounts[0]});

     console.log('contract deployed to address ', result.options.address);
}

deploy();


finally, show error JSON interface error Please help me,I am just a beginner at web3.js.I follow old tutorial to know the workflow But it does not match with updated versions here is depend

 "dependencies": {
    "next": "^11.1.2",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "solc": "^0.8.6",
    "truffle-hdwallet-provider": "^1.0.17",
    "web3": "^1.5.2"
  }

I need someone help to get deployed address to set here lottery.js file

 import web3 from './web3.js';
const address = '';
const abi = [{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"enterLottery","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"participants","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pickWinner","outputs":[],"stateMutability":"nonpayable","type":"function"}];

export default new web3.eth.Contract(abi,address);

Solution

  • in compile.js

    var output = JSON.parse(solc.compile(JSON.stringify(input))); // an object
    // it spits out bytecode and interface
    
    
    module.exports = output.contracts["Lottery.sol"]["Lottery"];
    

    in deploy.js

        const { abi, evm } = require("./compile");