Search code examples
javascriptethereumsolidityweb3js

Solidity: How to compile multiple smart contracts in compile.js file?


I would like to compile multiple contracts in one compile.js file but I'm not sure how to do it.

My compile.js file with a single contract looks like this:

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, 'utf8');

module.exports = solc.compile(source, 1);

How can I add more contracts to the compile.js file? I understand that the 1 must be changed to the number of contracts, but not sure what else is required?


Solution

  • Here is an example I did. You can find it in my public repo. Briefly, I have a "build" folder where I write the output of each compiled contract to Json files.

    const path = require("path"); //nodejs ’path’ module
        const solc = require("solc"); //solidity compiler module
        const fs = require("fs-extra"); //file system module
    
        // Feth path of build
        const buildPath = path.resolve(__dirname, "build");
        const contractspath = path.resolve(__dirname, "contracts");
    
        // Removes folder build and every file in it
        fs.removeSync(buildPath);
    
        // Fetch all Contract files in Contracts folder
        const fileNames = fs.readdirSync(contractspath);
    
        // Gets ABI of all contracts into variable input
        const input = fileNames.reduce(
          (input, fileName) => {
            const filePath = path.resolve(__dirname, "contracts", fileName);
            const source = fs.readFileSync(filePath, "utf8");
            return { sources: { ...input.sources, [fileName]: source } };
          },
          { sources: {} }
        );
    
        // Compile all contracts
        const output = solc.compile(input, 1).contracts;
    
        // Re-Create build folder for output files from each contract
        fs.ensureDirSync(buildPath);
    
        // Output contains all objects from all contracts
        // Write the contents of each to different files
        for (let contract in output) {
          fs.outputJsonSync(
            path.resolve(buildPath, contract.split(":")[1] + ".json"),
            output[contract]
          );
        }
    

    Basically, if you do not change your path struct to mine, you have to change you this part of the above code:

    // Feth path of build
            const buildPath = path.resolve(__dirname, "build");
            const contractspath = path.resolve(__dirname, "contracts");