Chainbridge-core is the project that was born from the existing version of Chainbridge. It was built to improve the maintainability and modularity of the current solution. The fundamental distinction is that chainbridge-core is more of a framework rather than a stand-alone application.
Project still in deep beta
- Chat with us on discord.
Refer to installation guide for assistance in installing.
The chainbridge-core-example currently supports two modules:
Since chainbridge-core is the modular framework it will require writing some code to get it running.
You can find some examples here.
Metrics, in chainbridge-core
are handled via injecting metrics provider compatible with Metrics interface into Relayer
instance. It currently needs only one method, TrackDepositMessage(m *message.Message)
which is called inside relayer router when a Deposit
event appears and should contain all necessary metrics data for extraction in custom implementations.
chainbridge-core
provides already implemented metrics provider via OpenTelemetry that is vendor-agnostic. It sends metrics to a separate collector that then sends metrics via configured exporters to one or many metrics back-ends.
This module provides instruction for communicating with EVM-compatible chains.
Usage:
evm-cli [flags]
evm-cli [command]
Available Commands:
accounts Set of commands for managing accounts
admin Set of commands for executing various admin actions
bridge Set of commands for interacting with a bridge
centrifuge Set of commands for interacting with a cetrifuge asset store contract
deploy Deploy smart contracts
erc20 Set of commands for interacting with ERC20 contract
erc721 Set of commands for interacting with an ERC721 contract
utils Set of utility commands
Flags:
-h, --help help for evm-cli
--gas-limit uint Gas limit used in transactions (default 6721975)
--gas-price uint Used as upperLimitGasPrice for transactions if not 0. Transactions gasPrice is defined by estimating it on network for pre London fork networks and by estimating BaseFee and MaxTipFeePerGas in post London networks
--json-wallet string Encrypted JSON wallet
--json-wallet-password string Password for encrypted JSON wallet
--network uint ID of the Network
--private-key string Private key to use
--url string URL of the node to receive RPC calls (default "ws://localhost:8545")
--prepare Generate calldata for contract calls (doesn't require private key and doesn't send a transaction)
Set of commands for managing accounts.
Usage:
evm-cli accounts [command]
Available Commands:
generate Generate bridge keystore (Secp256k1)
import Import a bridge keystore
transfer Transfer base currency
Flags:
-h, --help help for accounts
The generate subcommand is used to generate the bridge keystore. If no options are specified, a Secp256k1 key will be made.
Usage:
evm-cli accounts generate [flags]
Flags:
-h, --help help for generate
The import subcommand is used to import a keystore for the bridge.
Usage:
evm-cli accounts import [flags]
Flags:
-h, --help help for import
--private-key string Private key to use
--password string Password to encrypt with
The transfer subcommand is used to transfer the base currency.
Usage:
evm-cli accounts transfer [flags]
Flags:
--amount string Transfer amount
--decimals uint Base token decimals (default 0)
-h, --help help for transfer
--recipient string Recipient address
Set of commands for executing various admin actions.
Usage:
evm-cli admin [command]
Available Commands:
add-admin Add a new admin
add-relayer Add a new relayer
get-threshold Get the relayer vote threshold
is-relayer Check if an address is registered as a relayer
pause Pause deposits and proposals
remove-admin Remove an existing admin
remove-relayer Remove an existing relayer
set-deposit-nonce Set the deposit nonce
set-fee Set a new fee for deposits
set-threshold Set a new relayer vote threshold
unpause Unpause deposits and proposals
withdraw Withdraw tokens from a handler contract
Flags:
-h, --help help for admin
The add-admin subcommand sets an address as a bridge admin.
Usage:
evm-cli admin add-admin [flags]
Flags:
--admin string Address to add
--bridge string Bridge contract address
-h, --help help for add-admin
The add-relayer subcommand sets an address as a bridge relayer.
Usage:
evm-cli admin add-relayer [flags]
Flags:
--bridge string Bridge contract address
-h, --help help for add-relayer
--relayer string Address to add
The get-threshold subcommand returns the relayer vote threshold.
Usage:
evm-cli admin get-threshold [flags]
Flags:
--bridge string Bridge contract address
-h, --help help for get-threshold
The is-relayer subcommand checks if an address is registered as a relayer.
Usage:
evm-cli admin is-relayer [flags]
Flags:
--bridge string Bridge contract address
-h, --help help for is-relayer
--relayer string Address to check
The pause subcommand pauses deposits and proposals.
Usage:
evm-cli admin pause [flags]
Flags:
--bridge string Bridge contract address
-h, --help help for pause
The remove-admin subcommand removes an existing admin.
Usage:
evm-cli admin remove-admin [flags]
Flags:
--admin string Address to remove
--bridge string Bridge contract address
-h, --help help for remove-admin
The remove-relayer subcommand removes an existing relayer.
Usage:
evm-cli admin remove-relayer [flags]
Flags:
--bridge string Bridge contract address
-h, --help help for remove-relayer
--relayer string Address to remove
The set-deposit-nonce subcommand sets the deposit nonce. This nonce cannot be less than what is currently stored in the contract.
Usage:
evm-cli admin set-deposit-nonce [flags]
Flags:
--domain string Domain ID of chain
--deposit-nonce Deposit nonce to set (does not decrement)
--bridge string Bridge contract address
-h, --help help for set-fee
The set-fee subcommand sets a new fee for deposits.
Usage:
evm-cli admin set-fee [flags]
Flags:
--bridge string Bridge contract address
--fee string New fee (in ether)
-h, --help help for set-fee
The set-threshold subcommand sets a new relayer vote threshold.
Usage:
evm-cli admin set-threshold [flags]
Flags:
--bridge string Bridge contract address
-h, --help help for set-threshold
--threshold uint New relayer threshold
The unpause subcommand unpauses deposits and proposals.
Usage:
evm-cli admin unpause [flags]
Flags:
--bridge string Bridge contract address
-h, --help help for unpause
The withdraw subcommand withdrawals tokens from a handler contract.
Usage:
evm-cli admin withdraw [flags]
Flags:
--amount string Token amount to withdraw, use only if ERC20 token is withdrawn. If both amount and token are set an error will occur
--token string Token ID to withdraw, use only if ERC721 token is withdrawn. If both amount and token are set an error will occur
--bridge string Bridge contract address
--decimals uint ERC20 token decimals
--handler string Handler contract address
-h, --help help for withdraw
--recipient string Address to withdraw to
--token-contract string ERC20 or ERC721 token contract address
Set of commands for interacting with a bridge.
Usage:
evm-cli bridge [command]
Available Commands:
cancel-proposal Cancel an expired proposal
query-proposal Query an inbound proposal
query-resource Query the resource ID for a handler contract
register-generic-resource Register a generic resource ID
register-resource Register a resource ID
set-burn Set a token contract as mintable/burnable
Flags:
-h, --help help for bridge
The cancel-proposal subcommand cancels an expired proposal.
Usage:
evm-cli bridge cancel-proposal [flags]
Flags:
--bridge string Bridge contract address
--data-hash string Hash of proposal metadata
--deposit-nonce uint Deposit nonce of proposal to cancel
--domain uint Domain ID of proposal to cancel
-h, --help help for cancel-proposal
The query-proposal subcommand queries an inbound proposal.
Usage:
evm-cli bridge query-proposal [flags]
Flags:
--bridge string Bridge contract address
--data-hash string Hash of proposal metadata
--deposit-nonce uint Deposit nonce of proposal
--domain uint Source domain ID of proposal
-h, --help help for query-proposal
The query-resource subcommand queries the contract address with the provided resource ID for a specific handler contract.
Usage:
evm-cli bridge query-resource [flags]
Flags:
--handler string Handler contract address
-h, --help help for query-resource
--resource string Resource ID to query
The register-generic-resource subcommand registers a resource ID with a contract address for a generic handler.
Usage:
evm-cli bridge register-generic-resource [flags]
Flags:
--bridge string Bridge contract address
--deposit string Deposit function signature (default "0x00000000")
--execute string Execute proposal function signature (default "0x00000000")
--handler string Handler contract address
--hash Treat signature inputs as function prototype strings, hash and take the first 4 bytes
-h, --help help for register-generic-resource
--resource string Resource ID to query
--target string Contract address or hash storage to be registered
The register-resource subcommand registers a resource ID with a contract address for a handler.
Usage:
evm-cli bridge register-resource [flags]
Flags:
--bridge string Bridge contract address
--handler string Handler contract address
-h, --help help for register-resource
--resource string Resource ID to be registered
--target string Contract address to be registered
The set-burn subcommand sets a token contract as mintable/burnable in a handler.
Usage:
evm-cli bridge set-burn [flags]
Flags:
--bridge string Bridge contract address
--handler string ERC20 handler contract address
-h, --help help for set-burn
--token-contract string Token contract to be registered
The deploy subcommand deploys all or some of the contracts required for bridging. Selection of contracts can be made by either specifying --all or a subset of flags.
Usage:
evm-cli deploy [flags]
Flags:
--all Deploy all
--bridge Deploy bridge
--bridge-address string Bridge contract address. Should be provided if handlers are deployed separately
--domain uint8 Domain ID for the instance (default 1)
--erc20 Deploy ERC20
--erc20-handler Deploy ERC20 handler
--erc20-name string ERC20 contract name
--erc20-symbol string ERC20 contract symbol
--erc721 Deploy ERC721
--erc721-base-uri string ERC721 base URI
--erc721-handler Deploy ERC721 handler
--erc721-name string ERC721 contract name
--erc721-symbol string ERC721 contract symbol
--fee uint Fee to be taken when making a deposit (in ETH, decimals are allowed)
--generic-handler Deploy generic handler
-h, --help help for deploy
--relayer-threshold uint Number of votes required for a proposal to pass (default 1)
--relayers strings List of initial relayers
Set of commands for interacting with an ERC20 contract.
Usage:
evm-cli erc20 [command]
Available Commands:
add-minter Add a new ERC20 minter
approve Approve an ERC20 tokens
balance Query an ERC20 token balance
deposit Deposit an ERC20 token
get-allowance Get the allowance of a spender for an address
mint Mint an ERC20 token
Flags:
-h, --help help for erc20
The add-minter subcommand adds a minter to an ERC20 mintable contract.
Usage:
evm-cli erc20 add-minter [flags]
Flags:
--contract string ERC20 contract address
-h, --help help for add-minter
--minter string Minter address
The get-allowance subcommand returns the allowance of a spender for an address.
Usage:
evm-cli erc20 get-allowance [flags]
Flags:
--contract string ERC20 contract address
-h, --help help for get-allowance
--owner string Address of token owner
--spender string Address of spender
The approve subcommand approves tokens in an ERC20 contract for transfer.
Usage:
evm-cli erc20 approve [flags]
Flags:
--amount string Amount to grant allowance
--contract string ERC20 contract address
--decimals uint ERC20 token decimals
-h, --help help for approve
--recipient string Recipient address
The balance subcommand queries the balance of an account in an ERC20 contract.
Usage:
evm-cli erc20 balance [flags]
Flags:
--address string Address to receive balance of
--contract string ERC20 contract address
-h, --help help for balance
The deposit subcommand creates a new ERC20 token deposit on the bridge contract.
Usage:
evm-cli erc20 deposit [flags]
Flags:
--amount string Amount to deposit
--bridge string Address of bridge contract
--decimals uint ERC20 token decimals
--domain uint Destination domain ID
-h, --help help for deposit
--recipient string Address of recipient
--resource string Resource ID for transfer
The mint subcommand mints a token on an ERC20 mintable contract.
Usage:
evm-cli erc20 mint [flags]
Flags:
--amount string Deposit amount
--contract string ERC20 contract address
--decimals uint ERC20 token decimals
--recipient string Recipient address
-h, --help help for mint
ERC721-related instructions.
Usage:
evm-cli erc721 [command]
Available Commands:
add-minter Add a new ERC721 minter
approve Approve an ERC721 token
deposit Deposit an ERC721 token
mint Mint an ERC721 token
owner Get an ERC721 token owner
The add-minter subcommand adds a new minter address to an ERC721 mintable contract.
Usage:
evm-cli erc721 add-minter [flags]
Flags:
--contract string ERC721 contract address
-h, --help help for add-minter
--minter string Minter address
The approve subcommand approves a token in an ERC721 contract for transfer.
Usage:
evm-cli erc721 approve [flags]
Flags:
--contract string ERC721 contract address
-h, --help help for approve
--recipient string Recipient address
--token string ERC721 token ID
The deposit subcommand creates a new ERC721 token deposit on the bridge contract.
Usage:
evm-cli erc721 deposit [flags]
Flags:
--bridge string Bridge contract address
--destination string Destination domain ID
-h, --help help for deposit
--metadata string ERC721 token metadata
--recipient string Recipient address
--resource string Resource ID for transfer
--token string ERC721 token ID
The mint subcommand mints a token on an ERC721 mintable contract.
Usage:
evm-cli erc721 mint [flags]
Flags:
--contract string ERC721 contract address
-h, --help help for mint
--metadata string ERC721 token metadata
--recipient string Recipient address
--token string ERC721 token ID
The owner subcommand gets a token owner from an ERC721 mintable contract.
Usage:
evm-cli erc721 owner [flags]
Flags:
--contract string ERC721 contract address
-h, --help help for owner
--token string ERC721 token ID
Set of utility commands.
Usage:
evm-cli utils [command]
Available Commands:
hash-list List tx hashes within N number of blocks
simulate Simulate the invocation of a transaction
Flags:
-h, --help help for utils
The hash-list subcommand accepts a starting block to query, loops over N number of blocks past it, then prints this list of blocks to review hashes contained within.
Usage:
evm-cli utils hash-list [flags]
Flags:
--block-number string Block number to start at
--blocks string Number of blocks past the provided block-number to review
-h, --help help for hash-list
The simulate subcommand simulates a transaction result by simulating invocation; not state-altering.
Usage:
evm-cli utils simulate [flags]
Flags:
--block-number string Block number
--from string Address of sender
-h, --help help for simulate
--tx-hash string Transaction hash
Set of commands for interacting with a cetrifuge asset store contract.
Usage:
evm-cli centrifuge [command]
Available Commands:
deploy Deploy a centrifuge asset store contract
get-hash Returns the status of whether a given hash exists in an asset store
The deploy subcommand deploys a Centrifuge asset store contract that represents bridged Centrifuge assets.
Usage:
evm-cli centrifuge deploy
Flags:
-h, --help help for deploy
The get-hash subcommand checks the _assetsStored map on a Centrifuge asset store contract to determine whether the asset hash exists or not.
Usage:
evm-cli centrifuge get-hash [flags]
Flags:
--address string Centrifuge asset store contract address
--hash string A hash to lookup
-h, --help help for get-hash
This module provides instruction for communicating with Celo-compatible chains.
More information can be found about this module within its repository, listed below.
This module provides instruction for communicating with Substrate-compatible chains.
Currently there is no CLI for this, though more information can be found about this module within its repository, listed below.
Chainbridge-core is a open project and welcomes contributions of all kinds: code, docs, and more. If you wish to submit more complex changes, please check up with the core devs first on our Discord Server (look for CHAINBRIDGE category) or submit an issue on the repo to ensure those changes are in line with the general philoshophy of the project or get some early feedback.
When implementing a change:
- Adhere to the standard Go formatting guidelines, e.g. Effective Go. Run
go fmt
. - Stick to the idioms and patterns used in the codebase. Familiar-looking code has a higher chance of being accepted than eerie code. Pay attention to commonly used variable and parameter names, avoidance of naked returns, error handling patterns, etc.
- Comments: follow the advice on the Commentary section of Effective Go.
- Minimize code churn. Modify only what is strictly necessary. Well-encapsulated changesets will get a quicker response from maintainers.
- Lint your code with
golangci-lint
(CI will reject your PR if unlinted). - Add tests.
- Title the PR in a meaningful way and describe the rationale and the thought process in the PR description.
- Write clean, thoughtful, and detailed commit messages.
If change entails an update that needs to be documented, please submit a PR to chainbridge-docs repo.
Fork the repository, make changes and open a PR to the main
branch of the repo. Pull requests must be cleanly rebased on top of main
and changes require at least 2 PR approvals for them to be merged.
A great way to contribute to the project is to send a detailed report when you encounter an issue. We always appreciate a well-written, thorough bug report, and will thank you for it!
When reporting issues, always include:
- chainbridge-core version
- modules used
- logs (don't forget to remove sensitive data)
- tx hashes related to issue (if applicable)
- steps required to reproduce the problem
Putting large logs into a gist will be appreciated.
This section allows developers with a way to quickly and with minimal effort stand-up a local development environment in order to fully test out functionality of the chainbridge.
The local-setup command deploys a bridge, ERC20, ERC721 and generic handler contracts with preconfigured accounts and appropriate handlers.
Usage:
local-setup [flags]
Flags:
-h, --help help for local-setup
This can be easily run by building the chainbridge-core-example app, or by issuing a Makefile
instruction directly from the root of the chainbridge-core itself.
make local-setup
^ this command will run a shell script that contains instructions for running two EVM chains via Docker (docker-compose
). Note: this will likely take a few minutes to run.
You can also review our Local Setup Guide for a more detailed example of setting up a local development environment manually.
We take all security issues seriously, if you believe you have found a security issue within a ChainSafe project please notify us immediately. If an issue is confirmed, we will take all necessary precautions to ensure a statement and patch release is made in a timely manner.
Please email us a description of the flaw and any related information (e.g. reproduction steps, version) to security at chainsafe dot io.
GNU Lesser General Public License v3.0