Home

Awesome

Web3j Solidity Gradle Plugin

Simple Gradle plugin used by the Web3j plugin to compile Solidity contracts, but it can be used in any standalone project for this purpose.

Plugin configuration

To configure the Solidity Gradle Plugin using the plugins DSL or the legacy plugin application, check the plugin page. The minimum Gradle version to run the plugin is 5.+.

Then run this command from your project containing Solidity contracts:

./gradlew build

After the task execution, the base directory for compiled code (by default $buildDir/resources/solidity) will contain a directory for each source set (by default main and test), and each of those a directory with the compiled code.

Code generation

The solidity DSL allows to configure the generated code, e.g.:

solidity {
    outputComponents = [BIN, ABI, ASM_JSON]
    optimizeRuns = 500
}

The properties accepted by the DSL are listed in the following table:

NameTypeDefault valueDescription
executableStringnull (bundled with the plugin)Solidity compiler path.
versionStringnull (defined by contract's pragma)Solidity compiler version.
overwriteBooleantrueOverwrite existing files.
resolvePackagesBooleantrueResolve third-party contract packages.
optimizeBooleantrueEnable byte code optimizer.
optimizeRunsInteger200Set for how many contract runs to optimize.
prettyJsonBooleanfalseOutput JSON in pretty format. Enables the combined JSON output.
ignoreMissingBooleanfalseIgnore missing files.
allowPathsList<String>['src/main/solidity', 'src/test/solidity', ...]Allow a given path for imports.
pathRemappingsMap<String, String>[ : ]Remaps contract imports to target path.
evmVersionEVMVersionBYZANTIUMSelect desired EVM version.
outputComponentsOutputComponent[][BIN, ABI]List of output components to produce.
combinedOutputComponentsCombinedOutputComponent[][BIN, BIN_RUNTIME, SRCMAP, SRCMAP_RUNTIME]List of output components in combined JSON output.

Notes:

solidity {
    executable = "docker run --rm -v $projectDir/src:/src -v $projectDir/build:/build ethereum/solc:0.6.4-alpine"
    version = '0.4.15'
}

Source sets

By default, all .sol files in $projectDir/src/main/solidity and $projectDir/src/test/solidity will be processed by the plugin. To specify and add different source sets, use the sourceSets DSL. You can also set your preferred output directory for compiled code.

sourceSets {
    main {
        solidity {
            srcDir {
                "my/custom/path/to/solidity"
             }
             output.resourcesDir = file('out/bin/compiledSol') 
        }
    }
}

Now with solidity gradle plugin version 0.4.2, you can set different solidity versions, evmVersions, optimize flag, optimizeRuns and ignoreMissing flag values for different sourceSets.

sourceSets {
    main {
        solidity {
            srcDir {
                "my/custom/path/to/solidity"
            }
            output.resourcesDir = file('out/bin/compiledSol')
            setEvmVersion('ISTANBUL')
            setOptimize(true)
            setOptimizeRuns(200)
            setVersion('0.8.12')
        }
    }
}

Gradle Node Plugin

The plugin makes use of the Node plugin to resolve third-party contract dependencies. It currently supports Open Zeppelin and Uniswap.

When importing libraries from @openzeppelin/contracts in your Solidity contract, the plugin will use the task resolveSolidity to generate a package.json file required by the Node plugin.

By default, package.json will be generated under the build/ directory. If you wish to change the directory for the Node plugin, add the following snippet to your build.gradle file:

node {
    nodeProjectDir = file("my/custom/node/directory")
}

If it already exists, the plugin will keep the package.json file in that directory and will also download the node modules under the same directory.

Note: In case of problems with the package.json file, you can delete it, and it will be regenerated with the latest versions.

Plugin tasks

The Java Plugin adds tasks to your project build using a naming convention on a per source set basis (i.e. compileJava, compileTestJava).

Similarly, the Solidity plugin will add the tasks:

To obtain a list and description of all added tasks, run the command:

./gradlew tasks --all