This project demonstrates how to implement a console application to send inputs to a Cartesi Rollups DApp, both running locally and deployed on remote testnet networks. It's implemented in Typescript and uses the ethers library to communicate with the rollups smart contracts.
- node.js
- yarn
To build the console application, first clone the repository as follows:
git clone https://github.com/cartesi/rollups-examples.gitThen, build the application by executing the following commands:
cd frontend-console/
yarn
yarn buildThe console application can be used to perform several operations. The available commands can be queried as follows:
$ yarn start --help
Commands:
index.ts erc20 <command> Operations with ERC-20 tokens
index.ts erc721 <command> Operations with ERC-721 tokens
index.ts input <command> Operations with inputs
index.ts inspect Inspect the state of the DApp
index.ts notice <command> Operations with notices
index.ts report <command> Operations with reports
index.ts voucher <command> Operations with vouchers
Options:
--help Show help [boolean]
--version Show version number [boolean]In general terms, the application communicates with a Cartesi DApp through two different endpoints, one for layer-1 communication (underlying blockchain) and another for layer-2 communication (Cartesi Node). Layer-1 communication is used for sending data to the DApp, including depositing assets. On the other hand, communication through the layer-2 node is used when querying DApp information such as provable outputs (notices, vouchers) and application logs (reports), or when performing generic application-level queries (inspect).
The input send command adds inputs to a Cartesi Rollups DApp and has the following format:
yarn start input send --payload [message] <options>Examples:
-
Send an input to the current locally deployed DApp using Hardhat's default funded account:
yarn start input send --payload "my message" -
Send an input to an instance of the
echo-pythonDApp already deployed to the Ethereum Sepolia testnet, using a user's account and a user's gateway RPC on Alchemy:export MNEMONIC=<user sequence of twelve words> export RPC_URL=https://eth-sepolia.g.alchemy.com/v2/<USER_KEY> yarn start input send --payload "my message" --dapp echo-python
When sending data to a DApp, the console application needs to communicate with the underlying layer-1 blockchain. In order to do that, it needs the URL of a blockchain RPC gateway, the address of the DApp's Rollups smart contract on that blockchain, and an appropriate account with sufficient funds for submitting transactions to the network.
The following parameters are available to specify this configuration, with some default behaviors and values to make it convenient to the user, especially for a local development environment:
--rpc: provides the RPC URL of the remote blockchain gateway; if absent, its default value is "http://localhost:8545", which provides connectivity to the Hardhat node used for local development; it may also be specified by setting a value for the environment variableRPC_URL;--address: represents an explicit definition for the address of the DApp's Rollups smart contract, given as a hex string; if absent, the console application will look for other ways to determine this address, as explained below--addressFile: provides a path to a file containing the address as a hex string, and is only used ifaddressis absent--dapp: specifies the name of the DApp, with a default value of "dapp"; if bothaddressandaddressFileare absent, the console application will query the given RPC instance to infer the network being used, and will extract the DApp's address from file../deployments/<network>/<dapp>.json; as such, if none of the above parameters are specified, the DApp address will be determined by looking for the file../deployments/localhost/dapp.json;--mnemonic: determines an account for submitting transactions; when using thelocalhostnetwork, the application will use the defaultmnemonicfor the local Hardhat node, which is already funded; otherwise, you must define a mnemonic for an account that has funds in the specified network; you can also define this parameter by setting theMNEMONICenvironment variable;--accountIndex: specifies an account index to use from the provided mnemonic; if absent, index0is used;
The notice list, voucher list and report list commands display DApp notices, vouchers and reports associated with the given epoch and input.
yarn start notice list <options>yarn start voucher list <options>yarn start report list <options>Examples:
-
List all notices ever emitted for the current locally deployed DApp:
yarn start notice list
-
List all vouchers emitted for input
1of the current locally deployed DApp:yarn start voucher list --input 1
-
List notices for input
3of anecho-pythonDApp instance already deployed remotely:yarn start notice list --url https://<dapp-cartesi-node-url>/graphql --input 3
Options are:
--url Reader URL
--input Input indexIf the url parameter is absent, the console application will use a default value of "http://localhost:4000/graphql", which provides connectivity to the local Cartesi Node.
The notice validate command can be used to check if a given notice is authentic, meaning that its associated proof can be successfully verified by the Cartesi Rollups framework.
In a similar way, the voucher execute command can be used to submit a transaction on layer-1 as an output of a Cartesi DApp (e.g., to withdraw funds back from the Rollups framework).
Both commands can only be executed if a proof is available for the specified notice or voucher. Proofs are only effectively produced when its associated epoch finishes, which happens after the DApp's configured epoch period elapses (e.g., after one week). In a local development environment, it is possible to explicitly advance time in order to finish an epoch and have proofs be generated by the framework.
yarn start notice validate --index [index] --input [input] <options>yarn start voucher execute --index [index] --input [input] <options>Examples:
-
Validate notice with index
0of input1for the current locally deployed DApp, using Hardhat's default funded account:yarn start notice validate --index 0 --input 1
-
Execute voucher with index
1of input3for the current locally deployed DApp, using Hardhat's default funded account:yarn start voucher execute --index 1 --input 3
-
Validate notice with index
0of input5for anecho-pythonDApp already deployed to the Ethereum Sepolia testnet, using a user's account and a user's gateway RPC on Alchemy:export MNEMONIC=<user sequence of twelve words> export RPC_URL=https://eth-sepolia.g.alchemy.com/v2/<USER_KEY> yarn start notice validate --index 0 --input 5 --dapp echo-python --url https://<dapp-cartesi-node-url>/graphql
Options are:
--index Notice or Voucher index within its associated Input
--input Input index
--rpc URL of the RPC gateway to use
--address DApp Rollups contract address
--addressFile Path to a file containing the DApp Rollups contract address
--dapp DApp name
--mnemonic Wallet mnemonic
--accountIndex Account index from mnemonic
--url Reader URLThe url parameter has the same behavior as described for the notice/voucher list commands, whereas the other parameters behave as in the input send command.
The inspect command directly queries the DApp state within the Cartesi Machine. It can be used to send DApp-specific payloads that are interpreted by the application logic to yield a synchronous response.
In practice, this command simply sends an HTTP GET request to the specified inspect URL, and does a little bit of parsing on the response.
yarn start inspect --payload [payload] <options>Examples:
-
Inspect the state of the locally deployed DApp using a REST-like query:
yarn start inspect --payload "myresource?attr1=value1&attr2=value2" -
Inspect the state of the
echo-pythonDApp instance already deployed remotely:yarn start inspect --payload "mypayload" --url https://<dapp-cartesi-node-url>/inspect
Options are:
--url Reader inspect URLIf the url parameter is absent, the console application will use a default value of "http://localhost:5005/inspect", which provides connectivity to the local Cartesi Node.
Deposits of both ERC-20 and ERC-721 tokens are supported via similar commands. Aside from what is described in the sections below, the commands parameters behave as described for the input send command.
The erc20 deposit command deposits ERC-20 tokens in the DApp.
yarn start erc20 deposit --amount [amount] <options>Examples:
-
Deposit 10 CTSI in the locally deployed DApp:
yarn start erc20 deposit --amount 10000000000000000000
-
Deposit 10 CTSI in the
echo-pythonDApp instance already deployed to the Ethereum Sepolia testnet, using a user's account and a user's gateway RPC on Alchemy:export MNEMONIC=<user sequence of twelve words> export RPC_URL=https://eth-sepolia.g.alchemy.com/v2/<USER_KEY> yarn start erc20 deposit --amount 10000000000000000000 --dapp echo-python
Options are:
--erc20 ERC-20 address
--rpc URL of the RPC gateway to use
--address DApp Rollups contract address
--addressFile Path to a file containing the DApp Rollups contract address
--dapp DApp name
--mnemonic Wallet mnemonic
--accountIndex Account index from mnemonicIf the erc20 address is unspecified, the appropriate address for the SimpleERC20 token will be used for the target blockchain being specified.
The erc721 deposit command deposits ERC-721 tokens in the DApp.
yarn start erc721 deposit --tokenId [token_id] <options>Examples:
-
Deposit token with id
1in the locally deployed DApp:yarn start erc721 deposit --tokenId 1
-
Deposit token with id
1in theecho-pythonDApp instance already deployed to the Ethereum Sepolia testnet, using a user's account and a user's gateway RPC on Alchemy:export MNEMONIC=<user sequence of twelve words> export RPC_URL=https://eth-sepolia.g.alchemy.com/v2/<USER_KEY> yarn start erc721 deposit --tokenId 1 --dapp echo-python
Options are:
--rpc URL of the RPC gateway to use
--mnemonic Wallet mnemonic
--accountIndex Account index from mnemonic
--address DApp Rollups contract address
--addressFile Path to a file containing the DApp Rollups contract address
--dapp DApp name
--erc721 ERC-721 contract address
--tokenId The ID of the token being transferedIf the erc721 address is left unspecified, the address for the SimpleERC721 contract will be used for the target blockchain being specified.