Deployment
Last updated
Last updated
Before beginning this process, you should have:
Synced Chia full node
Synced Ethereum full node
A Coinbase Cloud account and access to your base RPC URL (details in step 1)
A Nostr relay (empty public key whitelist)
Access to the machine you intend to run the validator software on
Two hardware wallets, one for Ethereum (e.g., Trezor) and one for Chia (Tangem)
The Ozone wallet app installed on your phone
First, install the validator software from by following the . You'll then need generate your two (Chia/EVM) hot keys and a Nostr private key by running:
It is up to you if you want to back up mnemonics - a majority of validators can always rekey the portal. In the next step, you're going to use:
Chia/Ethereum private keys (hex format)
Nostr mnemonic
Before proceeding, please send a message that follows the template below on the deployment channel:
Once you send the message, you may proceed to the next step and save the private keys in the config file.
In the root of the 'cli' local copy, create a file called 'config.json' and paste the following template:
From the previous step, you should fill:
xch.my_hot_private_key
with your hot XCH key
eth.my_hot_private_key
and bse.my_hot_private_key
with your hot Ethereum key
nostr.my_mnemonic
with your Nostr mnemonic
After all validators have submitted their details, validator 0 will send a message containing values for:
xch.portal_keys
and xch.multisig_keys
eth.hot_addresses
= bse.hot_addresses
nostr.relays
The message will also contain a list of public keys to add to your Nostr server whitelist. At this point, you may can set:
xch.chia_root_or_chia_url
If you're running a node locally, replace this key with xch.chia_root
and set it to the location of the 'mainnet' folder (e.g., /home/yakuhito/.chia-testnet11/mainnet
)
If you are on testnet and your node is still syncing, replace the key with xch.chia_url
and set it to https://testnet.fireacademy.io
. Please make sure to switch it with the option above (xch.chia_root
) once you're synced!
xch.agg_sig_data
: This is a constant that is specific to the network you're running.
xch.portal_threshold
, xch.multisig_threshold
, eth.portal_threshold
, bse.portal_threshold
: Set to 3 for testnet, 7 for mainnet
eth.rpc_url
: Point this to your Ethereum RPC URL.
If you're on testnet and waiting for your node to sync, you can set the value to an Alchemy/Infura/etc. RPC URL. However, please make sure to make it point to your node later, as you should test your whole infrastructure.
For mainnet, the value should look like this: https://api.developer.coinbase.com/rpc/v1/base/[api-key]
For testnet, please ensure that you select 'Base Sepolia' (i.e., testnet) before copying the URL. It's somewhere on the page, and the default is mainnet even if you 'created' a testnet node. The value should look like this: https://api.developer.coinbase.com/rpc/v1/base-sepolia/[api-key]
Validator 0 will deploy the portal singleton on XCH and a multisig on each EVM network (Ethereum and Base). Once addresses are shared, fill in the following config values:
xch.portal_launcher_id
- Launcher id of portal singleton (will be sent in a message)
xch.min_height
- First block when messages can be sent. Will also be included in the message.
eth.deployer_safe_address
and bse.deployer_safe_address
: This is the cold key multisig. Get the addresses from the message and access them using the Safe{Wallet} app. Check that the threshold and addresses are set appropriately (same values as config).
In the Safe app, a deployment transaction will also be created shortly after. After updating the config, you can verify the transactions using:
Where [chain-id]
is either 'eth' or 'bse.' For each EVM network, you can go on to fill the following config values:
portal_address
: The address of the portal. In the deploy command output, you can find it under Tx 2: deploy TransparentUpgradeableProxy
as Predicted address
.
erc20_bridge_address
: The address of the ERC20Bridge
contract. It's the Predicted address
under Tx 3: deploy ERC20Bridge
.
Once the transaction has enough confirmations, it will be executed by validator 0. You'll then be able to fill in the last two config values, eth.min_height
and bse.min_height
. Their value should be the block that the contract deployment transaction was confirmed at.
You're now ready to run the validator software! Start it using:
Please see '' to see how to generate an attestation for your cold XCH key. Note that the config is not yet set, so you'll need to use the optional --pubkey
switch.
Testnet: 37a90eb5185a9c4439a91ddc98bbadce7b4feba060d50116a067de66bf236615
()
Mainnet: ccd5bb71183532bff220ba46c268991a3ff07eb358e8255a65c30a2dce0e5fbb
()
xch.sign_min_height
: The minimum number of confirmations a message needs to have on Chia for it to be signed. Used to prevent attacks exploiting re-orgs - set this value to 5 for testnet and 32 for mainnet ().
eth.sign_min_height
and bse.sign_min_height
: The minimum number of confirmations a message needs to have on L1 for it to be signed. Please see about finality. For mainnet, set this value to 64 (2 epochs). For testnet, set the value to 10 (~2 minutes) for Base and 64 for Ethereum (Sepolia).
bse.rpc_url
: You can create a Coinbase Cloud account . You'll be allowed to create a node for free (i.e., get an API key).