Command Line
Install the @accordproject/ergo-cli
npm package to access the Ergo command line interface (CLI). After installation you can use the ergo command and its sub-commands as described below.
To install the Ergo CLI:
npm install -g @accordproject/ergo-cli
This will install ergo
, to compile and run contracts locally on your machine, and ergotop
, which is a read-eval-print-loop utility to write Ergo interactively.
Ergo
Usage
ergo <command>
Commands:
ergo trigger send a request to the contract
ergo invoke invoke a clause of the contract
ergo initialize initialize the state for a contract
ergo compile compile a contract
Options:
--help Show help [boolean]
--version Show version number [boolean]
--verbose, -v [default: false]
ergo trigger
ergo trigger
allows you to send a request to the contract.
Usage: ergo trigger --data [file] --state [file] --request [file] [cto files] [ergo files]
Options:
--help Show help [boolean]
--version Show version number [boolean]
--verbose, -v [default: false]
--data path to the contract data [required]
--state path to the state data [string] [default: null]
--currentTime set current time [string] [default: null]
--utcOffset set UTC offset [number] [default: null]
--request path to the request data [array] [required]
--template path to the template directory [string] [default: null]
--warnings print warnings [boolean] [default: false]
Example
For example, using the trigger
command for the Volume Discount example in the Ergo Directory:
ergo trigger --template ./tests/volumediscount --data ./tests/volumediscount/data.json --request ./tests/volumediscount/request.json --state ./tests/volumediscount/state.json
returns:
{
"clause": "orgXaccordprojectXvolumediscountXVolumeDiscount",
"request": {
"$class": "org.accordproject.volumediscount.VolumeDiscountRequest",
"netAnnualChargeVolume": 10.4
},
"response": {
"$class": "org.accordproject.volumediscount.VolumeDiscountResponse",
"discountRate": 2.8,
"$timestamp": "2021-06-17T09:36:53.847-04:00"
},
"state": {
"$class": "org.accordproject.runtime.State",
"$identifier": "7c19d1e3-1f70-4b30-8c3d-086dc45b1dd1"
},
"emit": []
}
As the request
was sent for an annual charge volume of 10.4, which falls into the third discount rate category (as specified in the data.json
file), the response
returns with a discount rate of 2.8%.
ergo invoke
ergo invoke
allows you to invoke a specific clause of the contract. The main difference between ergo invoke
and ergo trigger
is that ergo invoke
sends data to a specific clause, whereas ergo trigger
lets the contract choose which clause to invoke. This is why --clauseName
(the name of the contract you want to execute) is a required field for ergo invoke
.
You need to pass the CTO and Ergo files (--template
), the name of the contract that you want to execute (--clauseName
), and JSON files for: the contract data (--data
), the contract parameters (--params
), the current state of the contract (--state
), and the request.
If contract invocation is successful, ergorun
will print out the response, the new contract state and any emitted events.
Usage: ergo invoke --data [file] --state [file] --params [file] [cto files] [ergo files]
Options:
--help Show help [boolean]
--version Show version number [boolean]
--verbose, -v [default: false]
--clauseName the name of the clause to invoke [required]
--data path to the contract data [required]
--state path to the state data [string] [required]
--currentTime set current time [string] [default: null]
--utcOffset set UTC offset [number] [default: null]
--params path to the parameters [string] [required] [default: {}]
--template path to the template directory [string] [default: null]
--warnings print warnings [boolean] [default: false]
Example
For example, using the invoke
command for the Volume Discount example in the Ergo Directory:
ergo invoke --template ./tests/volumediscount --clauseName volumediscount --data ./tests/volumediscount/data.json --params ./tests/volumediscount/params.json --state ./tests/volumediscount/state.json
returns:
{
"clause": "orgXaccordprojectXvolumediscountXVolumeDiscount",
"params": {
"request": {
"$class": "org.accordproject.volumediscount.VolumeDiscountRequest",
"netAnnualChargeVolume": 10.4
}
},
"response": {
"$class": "org.accordproject.volumediscount.VolumeDiscountResponse",
"discountRate": 2.8,
"$timestamp": "2021-06-17T09:38:03.189-04:00"
},
"state": {
"$class": "org.accordproject.runtime.State",
"$identifier": "b757ad1f-e011-4fda-9b37-e7157512300f"
},
"emit": []
}
Although this looks very similar to what ergo trigger
returns, it is important to note that --clauseName volumediscount
was specifically invoked.
ergo initialize
ergo initialize
allows you to obtain the initial state of the contract. This is the state of the contract without requests or responses.
Usage: ergo intialize --data [file] --params [file] [cto files] [ergo files]
Options:
--help Show help [boolean]
--version Show version number [boolean]
--verbose, -v [default: false]
--data path to the contract data [required]
--currentTime set current time [string] [default: null]
--utcOffset set UTC offset [number] [default: null]
--params path to the parameters [string] [default: null]
--template path to the template directory [string] [default: null]
--warnings print warnings [boolean] [default: false]
Example
For example, using the initialize
command for the Volume Discount example in the Ergo Directory:
ergo initialize --template ./tests/volumediscount --data ./tests/volumediscount/data.json
returns:
{
"clause": "orgXaccordprojectXvolumediscountXVolumeDiscount",
"params": {
},
"response": null,
"state": {
"$class": "org.accordproject.runtime.State",
"$identifier": "af4f0f49-2658-4465-87f4-780e7d2e38a8"
},
"emit": []
}
ergo compile
ergo compile
takes your input models (.cto
files) and input contracts (.ergo
files) and allows you to compile a contract into a target platform. By default, Ergo compiles to JavaScript (ES6 compliant) for execution.
Usage: ergo compile --target [lang] --link --monitor --warnings [cto files] [ergo files]
Options:
--help Show help [boolean]
--version Show version number [boolean]
--verbose, -v [default: false]
--target Target platform (available: es5,es6,cicero,java)
[string] [default: "es6"]
--link Link the Ergo runtime with the target code (es5,es6,cicero
only) [boolean] [default: false]
--monitor Produce compilation time information [boolean] [default: false]
--warnings print warnings [boolean] [default: false]
Example
For example, using the compile
command on the Volume Discount example in the Ergo Directory:
ergo compile ./tests/volumediscount/model/model.cto ./tests/volumediscount/logic/logic.ergo
returns:
Compiling Ergo './tests/volumediscount/logic/logic.ergo' -- './tests/volumediscount/logic/logic.js'
Which means a new logic.js
file is located in the ./tests/volumediscount/logic
directory.
To compile the contract to Javascript and link the Ergo runtime for execution:
ergo compile ./tests/volumediscount/model/model.cto ./tests/volumediscount/logic/logic.ergo --link
returns:
Compiling Ergo './tests/volumediscount/logic/logic.ergo' -- './tests/volumediscount/logic/logic.js'