# solppc-js
solppc-js
is a JavaScript binding for the Solidity++ compiler (opens new window).
# How to Install solppc-js
Install the latest stable version of the Solidity++ compiler from npm:
# Usage in Command-Line
If this package is installed globally (npm install -g solppc
), a command-line tool called solppcjs
will be available.
To see all the supported features, execute:
To compile a contract that imports other contracts via relative paths:
Use the --base-path
and --include-path
options to describe the layout of your project.
--base-path
represents the root of your own source tree--include-path
specifies extra locations containing external code (e.g. libraries installed with a package manager).
Note: make sure all the files you specify in the command are located inside the base path or one of the include paths. The compiler refers to files from outside of these directories using absolute paths. Having absolute paths in contract metadata will result in your bytecode being reproducible only when it's placed in these exact absolute locations.
Note: this command line interface is not compatible with
solppc
provided by the Solidity++ compiler package. Please refer to the solppc chapter for instructions to installsolppc
. Furthermore, the command line interface of solppc-js provides less features than the binary release.
# Usage in Projects
There are two ways to use solppc
:
- Through a high-level API giving a general interface to all compiler versions
- Through a low-level API giving access to all the compiler interfaces and choose the version of the compiler
# High-level API
The high-level API consists of a single method, compile
, which conforms to Compiler Standard Input and Output JSON (opens new window).
It also accepts an optional set of callback functions, which include the import
and the smtSolver
callbacks. Starting from 0.6.0 it only accepts an object in place of the callback to supply the callbacks.
The import
callback function is used to resolve unmet dependencies. This callback receives a path and must synchronously return either an error or the content of the dependency as a string. It cannot be used together with callback-based, asynchronous,
filesystem access. A workaround is to collect the names of dependencies, return an error, and keep re-running the compiler until all dependencies are resolved.
# Example usage without the import callback
Example:
# Example usage with import callback
The smtSolver
callback function is used to solve SMT queries generated by Solidity's SMTChecker. In case you have an SMT solver installed locally, it can be used to solve the given queries, where the callback must synchronously return either an error or the result from the solver. A default smtSolver
callback is distributed by solppc-js
, which relies on either Z3 or CVC4 being installed locally.
# Example usage with smtSolver callback
The assertion is clearly false, and an assertion failure
warning
should be returned.
# Low-level API
The low-level API is as follows:
solppc.lowlevel.compileSingle
: the original entry point, supports only a single filesolppc.lowlevel.compileMulti
: supports multiple files, introduced in 0.1.6solppc.lowlevel.compileCallback
: supports callbacks, introduced in 0.2.1solppc.lowlevel.compileStandard
: works just likecompile
above, but is only present in compilers after (and including) 0.4.11
For examples how to use them, please refer to the README of the above mentioned solppc-js releases.
# Linking Bytecode
When using libraries, the resulting bytecode will contain placeholders for the real addresses of the referenced libraries. These have to be updated, via a process called linking, before deploying the contract.
The linker
module (require('solppc/linker')
) offers helpers to accomplish this.
The linkBytecode
method provides a simple helper for linking:
As of Solidity 0.4.11 the compiler supports standard JSON input and output (opens new window) which outputs a link references map. This gives a map of library names to offsets in the bytecode to replace the addresses at. It also doesn't have the limitation on library file and contract name lengths.
There is a method available in the linker
module called findLinkReferences
which can find such link references in bytecode produced by an older compiler:
# Browser Usage
Add the version of solppc
you want to use into index.html
:
This will load solppc
into the global variable window.Module
. Then use this inside Javascript as:
Or in ES6 syntax: