Add deployment details for fixturenet-eth (#30)

Part of [Create bridge channel in go-nitro](https://www.notion.so/Create-bridge-channel-in-go-nitro-22ce80a0d8ae4edb80020a8f250ea270)

Co-authored-by: Shreerang Kale <shreerangkale@gmail.com>
Reviewed-on: cerc-io/testnet-laconicd-stack#30
This commit is contained in:
nabarun 2024-10-21 11:07:01 +00:00
parent 92e91ec50c
commit 81923f5323
6 changed files with 604 additions and 75 deletions

View File

@ -11,6 +11,7 @@ Stacks to run a node for laconic testnet
- [Update deployments after code changes](./ops/update-deployments.md) - [Update deployments after code changes](./ops/update-deployments.md)
- [Halt stage0 and start stage1](./ops/stage0-to-stage1.md) - [Halt stage0 and start stage1](./ops/stage0-to-stage1.md)
- [Create deployments from scratch (for reference only)](./ops/deployments-from-scratch.md) - [Create deployments from scratch (for reference only)](./ops/deployments-from-scratch.md)
- [Deploy and transfer new tokens for nitro operations](./ops/nitro-token-ops.md)
## Join LORO testnet ## Join LORO testnet

View File

@ -26,6 +26,114 @@
* laconic-so: see [installation](https://git.vdb.to/cerc-io/testnet-ops/src/branch/main/stack-orchestrator-setup/README.md#setup-stack-orchestrator) * laconic-so: see [installation](https://git.vdb.to/cerc-io/testnet-ops/src/branch/main/stack-orchestrator-setup/README.md#setup-stack-orchestrator)
<details open>
<summary>Fixturenet Eth</summary>
## Fixturenet Eth
* Stack: <https://git.vdb.to/cerc-io/fixturenet-eth-stacks>
* Target dir: `/srv/fixturenet-eth/fixturenet-eth-deployment`
* Cleanup an existing deployment if required:
```bash
cd /srv/fixturenet-eth
# Stop the deployment
laconic-so deployment --dir fixturenet-eth-deployment stop --delete-volumes
# Remove the deployment dir
sudo rm -rf fixturenet-eth-deployment
```
### Setup
* Create a `fixturenet-eth` dir if not present already and cd into it
```bash
mkdir /srv/fixturenet-eth
cd /srv/fixturenet-eth
```
* Clone the stack repo:
```bash
laconic-so fetch-stack git.vdb.to/cerc-io/fixturenet-eth-stacks --pull
```
* Clone required repositories:
```bash
laconic-so --stack ~/cerc/fixturenet-eth-stacks/stack-orchestrator/stacks/fixturenet-eth setup-repositories --pull
# If this throws an error as a result of being already checked out to a branch/tag in a repo, remove all repositories from that stack and re-run the command
# The repositories are located in $HOME/cerc by default
```
* Build the container images:
```bash
# Remove any older foundry image with `latest` tag
docker rmi ghcr.io/foundry-rs/foundry:latest
laconic-so --stack ~/cerc/fixturenet-eth-stacks/stack-orchestrator/stacks/fixturenet-eth build-containers --force-rebuild
# If errors are thrown during build, old images used by this stack would have to be deleted
```
* NOTE: this will take >10 mins depending on the specs of your machine, and **requires** 16GB of memory or greater.
* Remove any dangling Docker images (to clear up space):
```bash
docker image prune
```
* Create spec files for deployments, which will map the stack's ports and volumes to the host:
```bash
laconic-so --stack ~/cerc/fixturenet-eth-stacks/stack-orchestrator/stacks/fixturenet-eth deploy init --output fixturenet-eth-spec.yml
```
* Configure ports:
* `fixturenet-eth-spec.yml`
```yml
...
network:
ports:
fixturenet-eth-bootnode-geth:
- '9898:9898'
- '30303'
fixturenet-eth-geth-1:
- '7545:8545'
- '7546:8546'
- '40000'
- '6060'
fixturenet-eth-lighthouse-1:
- '8001'
...
```
* Create deployments:
Once you've made any needed changes to the spec files, create deployments from them:
```bash
laconic-so --stack ~/cerc/fixturenet-eth-stacks/stack-orchestrator/stacks/fixturenet-eth deploy create --spec-file fixturenet-eth-spec.yml --deployment-dir fixturenet-eth-deployment
```
### Run
* Start `fixturenet-eth-deployment` deployment:
```bash
laconic-so deployment --dir fixturenet-eth-deployment start
```
</details>
<details open> <details open>
<summary>Nitro Contracts Deployment</summary> <summary>Nitro Contracts Deployment</summary>
@ -47,6 +155,7 @@
# Remove the deployment dir # Remove the deployment dir
sudo rm -rf nitro-contracts-deployment sudo rm -rf nitro-contracts-deployment
```
### Setup ### Setup
@ -65,21 +174,21 @@
* Edit [`contract-vars.yml`](./contract-vars.yml) and fill in the following values: * Edit [`contract-vars.yml`](./contract-vars.yml) and fill in the following values:
```bash ```bash
# L1 RPC endpoint # RPC endpoint
geth_url: "https://sepolia.laconic.com" geth_url: "https://fixturenet-eth.laconic.com"
# L1 chain ID (Sepolia: 11155111) # Chain ID (Fixturenet-eth: 1212)
geth_chain_id: "11155111" geth_chain_id: "1212"
# Private key for a funded L1 account, to be used for contract deployment on L1 # Private key for a funded L1 account, to be used for contract deployment on L1
# Must also be funded on L2 for deploying contracts
# Required since this private key will be utilized by both L1 and L2 nodes of the bridge # Required since this private key will be utilized by both L1 and L2 nodes of the bridge
geth_deployer_pk: ""
# Custom L1 token to be deployed geth_deployer_pk: "888814df89c4358d7ddb3fa4b0213e7331239a80e1f013eaa7b2deca2a41a218"
token_name: ""
token_symbol: "" # Custom token to be deployed
intial_token_supply: "" token_name: "TestToken"
token_symbol: "TST"
initial_token_supply: "129600"
``` ```
* Update the target dir in `setup-vars.yml`: * Update the target dir in `setup-vars.yml`:
@ -142,6 +251,8 @@
laconic-so deployment --dir nitro-contracts-deployment logs nitro-contracts -f laconic-so deployment --dir nitro-contracts-deployment logs nitro-contracts -f
``` ```
* To deploy a new token and transfer it to another account, refer to this [doc](./nitro-token-ops.md)
</details> </details>
<details open> <details open>
@ -178,10 +289,10 @@
# Expected output: # Expected output:
# { # {
# "11155111": [ # "1212": [
# { # {
# "name": "geth", # "name": "geth",
# "chainId": "11155111", # "chainId": "1212",
# "contracts": { # "contracts": {
# "ConsensusApp": { # "ConsensusApp": {
# "address": "0xC98aD0B41B9224dad0605be32A9241dB9c67E2e8" # "address": "0xC98aD0B41B9224dad0605be32A9241dB9c67E2e8"
@ -192,7 +303,7 @@
# "VirtualPaymentApp": { # "VirtualPaymentApp": {
# "address": "0x778e4e6297E8BF04C67a20Ec989618d72eB4a19E" # "address": "0x778e4e6297E8BF04C67a20Ec989618d72eB4a19E"
# }, # },
# "Token": { # "TestToken": {
# "address": "0x02ebfB2706527C7310F2a7d9098b2BC61014C5F2" # "address": "0x02ebfB2706527C7310F2a7d9098b2BC61014C5F2"
# } # }
# } # }
@ -217,16 +328,16 @@
```bash ```bash
# WS endpoint # WS endpoint
nitro_chain_url: "wss://sepolia.laconic.com" nitro_chain_url: "wss://fixturenet-eth.laconic.com"
# Private key for bridge Nitro address # Private key for bridge Nitro address
nitro_sc_pk: "" nitro_sc_pk: ""
# Private key should correspond to a funded account on L1 and this account must own the Nitro contracts # Private key should correspond to a funded account on L1 and this account must own the Nitro contracts
# It also needs to hold L1 tokens to fund Nitro channels # It also needs to hold L1 tokens to fund Nitro channels
nitro_chain_pk: "" nitro_chain_pk: "888814df89c4358d7ddb3fa4b0213e7331239a80e1f013eaa7b2deca2a41a218"
# Deployed L1 Nitro contract addresses # Deployed Nitro contract addresses
na_address: "" na_address: ""
vpa_address: "" vpa_address: ""
ca_address: "" ca_address: ""
@ -298,14 +409,12 @@
cd /srv/bridge cd /srv/bridge
# Create required variables # Create required variables
GETH_CHAIN_ID="11155111" GETH_CHAIN_ID="1212"
export NA_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"$GETH_CHAIN_ID\"[0].contracts.NitroAdjudicator.address' /app/deployment/nitro-addresses.json") export NA_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"$GETH_CHAIN_ID\"[0].contracts.NitroAdjudicator.address' /app/deployment/nitro-addresses.json")
export CA_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"$GETH_CHAIN_ID\"[0].contracts.ConsensusApp.address' /app/deployment/nitro-addresses.json") export CA_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"$GETH_CHAIN_ID\"[0].contracts.ConsensusApp.address' /app/deployment/nitro-addresses.json")
export VPA_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"$GETH_CHAIN_ID\"[0].contracts.VirtualPaymentApp.address' /app/deployment/nitro-addresses.json") export VPA_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"$GETH_CHAIN_ID\"[0].contracts.VirtualPaymentApp.address' /app/deployment/nitro-addresses.json")
export ASSET_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"$GETH_CHAIN_ID\"[0].contracts.Token.address' /app/deployment/nitro-addresses.json")
export BRIDGE_NITRO_ADDRESS=$(laconic-so deployment --dir bridge-deployment exec nitro-rpc-client "nitro-rpc-client get-node-info -p 4005 -h nitro-bridge" | jq -r '.SCAddress') export BRIDGE_NITRO_ADDRESS=$(laconic-so deployment --dir bridge-deployment exec nitro-rpc-client "nitro-rpc-client get-node-info -p 4005 -h nitro-bridge" | jq -r '.SCAddress')
export BRIDGE_PEER_ID=$(laconic-so deployment --dir bridge-deployment exec nitro-rpc-client "nitro-rpc-client get-node-info -p 4005 -h nitro-bridge" | jq -r '.MessageServicePeerId') export BRIDGE_PEER_ID=$(laconic-so deployment --dir bridge-deployment exec nitro-rpc-client "nitro-rpc-client get-node-info -p 4005 -h nitro-bridge" | jq -r '.MessageServicePeerId')
@ -313,27 +422,41 @@
export L1_BRIDGE_MULTIADDR="/dns4/bridge.laconic.com/tcp/3005/p2p/$BRIDGE_PEER_ID" export L1_BRIDGE_MULTIADDR="/dns4/bridge.laconic.com/tcp/3005/p2p/$BRIDGE_PEER_ID"
export L2_BRIDGE_MULTIADDR="/dns4/bridge.laconic.com/tcp/3006/p2p/$BRIDGE_PEER_ID" export L2_BRIDGE_MULTIADDR="/dns4/bridge.laconic.com/tcp/3006/p2p/$BRIDGE_PEER_ID"
# Create the required config file # Create the required config files
cat <<EOF > nitro-node-config.yml cat <<EOF > nitro-node-config.yml
nitro_chain_url: "wss://sepolia.laconic.com" nitro_chain_url: "wss://fixturenet-eth.laconic.com"
na_address: "$NA_ADDRESS" na_address: "$NA_ADDRESS"
ca_address: "$CA_ADDRESS" ca_address: "$CA_ADDRESS"
vpa_address: "$VPA_ADDRESS" vpa_address: "$VPA_ADDRESS"
asset_address: "${ASSET_ADDRESS}"
bridge_nitro_address: "$BRIDGE_NITRO_ADDRESS" bridge_nitro_address: "$BRIDGE_NITRO_ADDRESS"
nitro_l1_bridge_multiaddr: "$L1_BRIDGE_MULTIADDR" nitro_l1_bridge_multiaddr: "$L1_BRIDGE_MULTIADDR"
nitro_l2_bridge_multiaddr: "$L2_BRIDGE_MULTIADDR" nitro_l2_bridge_multiaddr: "$L2_BRIDGE_MULTIADDR"
EOF EOF
laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq --arg chainId \"$GETH_CHAIN_ID\" '{
(\$chainId): [
{
\"name\": .[\$chainId][0].name,
\"chainId\": .[\$chainId][0].chainId,
\"contracts\": (
.[\$chainId][0].contracts
| to_entries
| map(select(.key | in({\"ConsensusApp\":1, \"NitroAdjudicator\":1, \"VirtualPaymentApp\":1}) | not))
| from_entries
)
}
]
}' /app/deployment/nitro-addresses.json" > assets.json
``` ```
* The required config file should be generated at `/srv/bridge/nitro-node-config.yml` * The required config files should be generated at `/srv/bridge/nitro-node-config.yml` and `/srv/bridge/assets.json`
* Check in the generated file at location `ops/stage2/nitro-node-config.yml` within this repository * Check in the generated files at locations `ops/stage2/nitro-node-config.yml` and `ops/stage2/assets.json` within this repository respectively
* List down L2 channels created by the bridge: * List down L2 channels created by the bridge:
```bash ```bash
laconic-so deployment --dir bridge-deployment exec nitro-rpc-client "nitro-rpc-client get-all-l2-channels -p 4006 -h nitro-bridge" laconic-so deployment --dir bridge-deployment exec nitro-rpc-client "nitro-rpc-client get-all-l2-channels -p 4005 -h nitro-bridge"
``` ```
</details> </details>
@ -1008,6 +1131,8 @@ https://loro-console.laconic.com -> 4001
# Machine 2 # Machine 2
https://sepolia.laconic.com -> 8545 https://sepolia.laconic.com -> 8545
wss://sepolia.laconic.com -> 8546 wss://sepolia.laconic.com -> 8546
https://fixturenet-eth.laconic.com -> 7545
wss://fixturenet-eth.laconic.com -> 7546
bridge.laconic.com bridge.laconic.com
Open ports: Open ports:

63
ops/nitro-token-ops.md Normal file
View File

@ -0,0 +1,63 @@
# Nitro Token Ops
## Setup
* Go to the directory where `nitro-contracts-deployment` is present:
```bash
cd /srv/bridge
```
## Deploy new token
* To deploy another token:
```bash
# These values can be changed to deploy another token with different name and symbol
export TOKEN_NAME="TestToken2"
export TOKEN_SYMBOL="TST2"
# Note: Token supply denotes actual number of tokens and not the supply in Wei
export INITIAL_TOKEN_SUPPLY="129600"
laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "TOKEN_NAME=$TOKEN_NAME TOKEN_SYMBOL=$TOKEN_SYMBOL INITIAL_TOKEN_SUPPLY=$INITIAL_TOKEN_SUPPLY /app/deploy-l1-tokens.sh"
```
* Recreate `assets.json` to include newly deployed token address:
```bash
export GETH_CHAIN_ID="1212"
laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq --arg chainId \"$GETH_CHAIN_ID\" '{
(\$chainId): [
{
\"name\": .[\$chainId][0].name,
\"chainId\": .[\$chainId][0].chainId,
\"contracts\": (
.[\$chainId][0].contracts
| to_entries
| map(select(.key | in({\"ConsensusApp\":1, \"NitroAdjudicator\":1, \"VirtualPaymentApp\":1}) | not))
| from_entries
)
}
]
}' /app/deployment/nitro-addresses.json" > assets.json
```
* The required config file should be generated at `/srv/bridge/assets.json`
* Check in the generated file at location `ops/stage2/assets.json` within this repository
## Transfer deployed tokens to given address
* To transfer a token to an account:
```bash
export GETH_CHAIN_ID=1212
export TOKEN_NAME="<name-of-token-to-be-transferred>"
export ASSET_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"$GETH_CHAIN_ID\"[0].contracts.$TOKEN_NAME.address' /app/deployment/nitro-addresses.json")
export ACCOUNT="<target-account-address>"
export AMOUNT="<transfer-amount>"
laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "cd packages/nitro-protocol && yarn hardhat transfer --contract $ASSET_ADDRESS --to $ACCOUNT --amount 1000 --network geth"
```

16
ops/stage2/assets.json Normal file
View File

@ -0,0 +1,16 @@
{
"1212": [
{
"name": "geth",
"chainId": "1212",
"contracts": {
"TestToken": {
"address": "0x2b79F4a92c177B4E61F5c4AC37b1B8A623c665A4"
},
"TestToken2": {
"address": "0xa6B4B8b84576047A53255649b4994743d9C83A71"
}
}
}
]
}

View File

@ -1,8 +1,7 @@
nitro_chain_url: "wss://sepolia.laconic.com" nitro_chain_url: "wss://fixturenet-eth.laconic.com"
na_address: "0xfD5276DDfE0E7738Af5F3dA0dE58D36560BbE544" na_address: "0x2B6AFbd4F479cE4101Df722cF4E05F941523EaD9"
ca_address: "0xC71F47d58d521aE24FDf5e324969aCD6f83b6Ff8" ca_address: "0xBca48057Da826cB2eb1258E2C679678b269dC262"
vpa_address: "0xEA55dEab3718CF4d084a94Fe4C0D750a80Eb1F2C" vpa_address: "0xCf5207018766587b8cBad4B8B1a1a38c225ebA7A"
asset_address: "0xa4351114dAE1aBEb2d552d441C9733c72682a45D"
bridge_nitro_address: "0xf0E6a85C6D23AcA9ff1b83477D426ed26F218185" bridge_nitro_address: "0xf0E6a85C6D23AcA9ff1b83477D426ed26F218185"
nitro_l1_bridge_multiaddr: "/dns4/bridge.laconic.com/tcp/3005/p2p/16Uiu2HAky2PYTfBNHpytybz4ADY9n7boiLgK5btJpTrGVbWC3diZ" nitro_l1_bridge_multiaddr: "/dns4/bridge.laconic.com/tcp/3005/p2p/16Uiu2HAky2PYTfBNHpytybz4ADY9n7boiLgK5btJpTrGVbWC3diZ"
nitro_l2_bridge_multiaddr: "/dns4/bridge.laconic.com/tcp/3006/p2p/16Uiu2HAky2PYTfBNHpytybz4ADY9n7boiLgK5btJpTrGVbWC3diZ" nitro_l2_bridge_multiaddr: "/dns4/bridge.laconic.com/tcp/3006/p2p/16Uiu2HAky2PYTfBNHpytybz4ADY9n7boiLgK5btJpTrGVbWC3diZ"

View File

@ -35,12 +35,35 @@
# na_address: "" # na_address: ""
# ca_address: "" # ca_address: ""
# vpa_address: "" # vpa_address: ""
# asset_address: ""
# bridge_nitro_address: "" # bridge_nitro_address: ""
# nitro_l1_bridge_multiaddr: "" # nitro_l1_bridge_multiaddr: ""
# nitro_l2_bridge_multiaddr: "" # nitro_l2_bridge_multiaddr: ""
``` ```
* Fetch required asset addresses:
```bash
wget -O assets.json https://git.vdb.to/cerc-io/testnet-laconicd-stack/raw/branch/main/ops/stage2/assets.json
# Example output:
# {
# "1212": [
# {
# "name": "geth",
# "chainId": "1212",
# "contracts": {
# "TestToken": {
# "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9"
# },
# "TestToken2": {
# "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9"
# }
# }
# }
# ]
# }
```
* TODO: Get L1 tokens on your address * TODO: Get L1 tokens on your address
* Edit `nitro-vars.yml` and add the following variables: * Edit `nitro-vars.yml` and add the following variables:
@ -184,7 +207,10 @@ Create a ledger channel with the bridge on L1 which is mirrored on L2
cd $DEPLOYMENTS_DIR/nitro-node cd $DEPLOYMENTS_DIR/nitro-node
export BRIDGE_NITRO_ADDRESS=$(yq eval '.bridge_nitro_address' nitro-node-config.yml) export BRIDGE_NITRO_ADDRESS=$(yq eval '.bridge_nitro_address' nitro-node-config.yml)
export ASSET_ADDRESS=$(yq eval '.asset_address' nitro-node-config.yml)
# Get asset addresses from assets.json file
export ASSET_ADDRESS_1=$(jq -r --arg chainId "$CHAIN_ID" '.[$chainId][0].contracts.TestToken.address' assets.json)
export ASSET_ADDRESS_2=$(jq -r --arg chainId "$CHAIN_ID" '.[$chainId][0].contracts.TestToken2.address' assets.json)
``` ```
* Check that check that you have no existing channels on L1 or L2: * Check that check that you have no existing channels on L1 or L2:
@ -200,10 +226,7 @@ Create a ledger channel with the bridge on L1 which is mirrored on L2
* Create a ledger channel between your L1 Nitro node and Bridge with custom asset: * Create a ledger channel between your L1 Nitro node and Bridge with custom asset:
```bash ```bash
# Set amount to ledger laconic-so deployment --dir l1-nitro-deployment exec nitro-rpc-client "nitro-rpc-client direct-fund $BRIDGE_NITRO_ADDRESS --asset "$ASSET_ADDRESS_1:1000,1000" --asset "$ASSET_ADDRESS_2:1000,1000" -p 4005 -h nitro-node"
LEDGER_AMOUNT=1000000
laconic-so deployment --dir l1-nitro-deployment exec nitro-rpc-client "nitro-rpc-client direct-fund $BRIDGE_NITRO_ADDRESS --assetAddress $ASSET_ADDRESS --alphaAmount $LEDGER_AMOUNT --betaAmount $LEDGER_AMOUNT -p 4005 -h nitro-node"
# Follow your L1 Nitro node logs for progress # Follow your L1 Nitro node logs for progress
@ -234,17 +257,26 @@ Create a ledger channel with the bridge on L1 which is mirrored on L2
```bash ```bash
laconic-so deployment --dir l1-nitro-deployment exec nitro-rpc-client "nitro-rpc-client get-ledger-channel $LEDGER_CHANNEL_ID -p 4005 -h nitro-node" laconic-so deployment --dir l1-nitro-deployment exec nitro-rpc-client "nitro-rpc-client get-ledger-channel $LEDGER_CHANNEL_ID -p 4005 -h nitro-node"
# Expected output: # Example output:
# { # {
# ID: '0x161d289a50222caa781db215bb82a3ede4f557217742245525b8e8cbff04ec21', # ID: '0xbb28acc2e1543f4b41eb1ab9eb2e354b18554aefe4e7f0fa5f20046869d8553f',
# Status: 'Open', # Status: 'Open',
# Balance: { # Balances: [
# AssetAddress: '<l1-asset-address>', # {
# Me: '<your-nitro-address>', # AssetAddress: '0xa6b4b8b84576047a53255649b4994743d9c83a71',
# Them: '<bridge-nitro-address>', # Me: '0xdaaa6ef3bc03f9c7dabc9a02847387d2c19107f5',
# MyBalance: <ledger-amount>n, # Them: '0xf0e6a85c6d23aca9ff1b83477d426ed26f218185',
# TheirBalance: <ledger-amount>n # MyBalance: 1000n,
# TheirBalance: 1000n
# }, # },
# {
# AssetAddress: '0x0000000000000000000000000000000000000000',
# Me: '0xdaaa6ef3bc03f9c7dabc9a02847387d2c19107f5',
# Them: '0xf0e6a85c6d23aca9ff1b83477d426ed26f218185',
# MyBalance: 1000n,
# TheirBalance: 1000n
# }
# ],
# ChannelMode: 'Open' # ChannelMode: 'Open'
# } # }
``` ```
@ -254,18 +286,27 @@ Create a ledger channel with the bridge on L1 which is mirrored on L2
```bash ```bash
laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client get-all-ledger-channels -p 4005 -h nitro-node" laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client get-all-ledger-channels -p 4005 -h nitro-node"
# Expected output: # Example output:
# [ # [
# { # {
# "ID": "0x6a9f5ccf1fa802525d794f4a899897f947615f6acc7141e61e056a8bfca29179", # "ID": "0xb34210b763d4fdd534190ba11886ad1daa1e411c87be6fd20cff74cd25077c46",
# "Status": "Open", # "Status": "Open",
# "Balance": { # "Balances": [
# "AssetAddress": "<l2-asset-address>", # {
# "Me": "<your-nitro-address>", # "AssetAddress": "0xa4351114dae1abeb2d552d441c9733c72682a45d",
# "Them": "<bridge-nitro-address>", # "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05",
# "MyBalance": <ledger-amount>n, # "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185",
# "TheirBalance": <ledger-amount>n # "MyBalance": 1000,
# "TheirBalance": 1000
# }, # },
# {
# "AssetAddress": "0x314e43f9825b10961859c2a62c2de6a765c1c1f1",
# "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05",
# "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185",
# "MyBalance": 1000,
# "TheirBalance": 1000
# }
# ],
# "ChannelMode": "Open" # "ChannelMode": "Open"
# } # }
# ] # ]
@ -275,6 +316,10 @@ Create a ledger channel with the bridge on L1 which is mirrored on L2
Perform payments using a virtual payment channel created with another Nitro node over the mirrored L2 channel with bridge as an intermediary Perform payments using a virtual payment channel created with another Nitro node over the mirrored L2 channel with bridge as an intermediary
* Prerequisite: Ledger channel is required to create a payment channel
* Note: Currently payment channel is created from first asset present in ledger channel
* Run the following commands on deployment machine * Run the following commands on deployment machine
* Switch to the `nitro-node` directory: * Switch to the `nitro-node` directory:
@ -290,18 +335,27 @@ Perform payments using a virtual payment channel created with another Nitro node
```bash ```bash
laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client get-all-ledger-channels -p 4005 -h nitro-node" laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client get-all-ledger-channels -p 4005 -h nitro-node"
# Expected output: # Example output:
# [ # [
# { # {
# "ID": "0x6a9f5ccf1fa802525d794f4a899897f947615f6acc7141e61e056a8bfca29179", # "ID": "0xb34210b763d4fdd534190ba11886ad1daa1e411c87be6fd20cff74cd25077c46",
# "Status": "Open", # "Status": "Open",
# "Balance": { # "Balances": [
# "AssetAddress": "<l2-asset-address>", # {
# "Me": "<your-nitro-address>", # "AssetAddress": "0xa4351114dae1abeb2d552d441c9733c72682a45d",
# "Them": "<bridge-nitro-address>", # "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05",
# "MyBalance": Xn, # "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185",
# "TheirBalance": Yn # "MyBalance": 1000,
# "TheirBalance": 1000
# }, # },
# {
# "AssetAddress": "0x314e43f9825b10961859c2a62c2de6a765c1c1f1",
# "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05",
# "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185",
# "MyBalance": 1000,
# "TheirBalance": 1000
# }
# ],
# "ChannelMode": "Open" # "ChannelMode": "Open"
# } # }
# ] # ]
@ -319,7 +373,7 @@ Perform payments using a virtual payment channel created with another Nitro node
export L2_CHANNEL_ID=<l2-channel-id> export L2_CHANNEL_ID=<l2-channel-id>
# Amount to create the payment channel with # Amount to create the payment channel with
export PAYMENT_CHANNEL_AMOUNT=10000 export PAYMENT_CHANNEL_AMOUNT=500
``` ```
* Check for existing payment channels for the L2 channel: * Check for existing payment channels for the L2 channel:
@ -396,18 +450,27 @@ Perform payments using a virtual payment channel created with another Nitro node
```bash ```bash
laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client get-all-ledger-channels -p 4005 -h nitro-node" laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client get-all-ledger-channels -p 4005 -h nitro-node"
# Expected output: # Example output:
# [ # [
# { # {
# "ID": "0x6a9f5ccf1fa802525d794f4a899897f947615f6acc7141e61e056a8bfca29179", # "ID": "0xb34210b763d4fdd534190ba11886ad1daa1e411c87be6fd20cff74cd25077c46",
# "Status": "Open", # "Status": "Open",
# "Balance": { # "Balances": [
# "AssetAddress": "<l2-asset-address>", # {
# "Me": "<your-nitro-address>", # "AssetAddress": "0xa4351114dae1abeb2d552d441c9733c72682a45d",
# "Them": "<bridge-nitro-address>", # "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05",
# "MyBalance": <your-updated-balance>n, # "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185",
# "TheirBalance": <bridge-updated-balance>n # "MyBalance": <updated balance>,
# "TheirBalance": <updated balance>
# }, # },
# {
# "AssetAddress": "0x314e43f9825b10961859c2a62c2de6a765c1c1f1",
# "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05",
# "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185",
# "MyBalance": <updated balance>,
# "TheirBalance": <updated balance>
# }
# ],
# "ChannelMode": "Open" # "ChannelMode": "Open"
# } # }
# ] # ]
@ -415,6 +478,256 @@ Perform payments using a virtual payment channel created with another Nitro node
Your balance on the L2 channel should be reduced by total payments done on the virtual payment channel Your balance on the L2 channel should be reduced by total payments done on the virtual payment channel
## Swaps on L2
Perform swaps using a swap channel created with another Nitro node over the mirrored L2 channel with bridge as an intermediary
* Prerequisite: Ledger channel is required to create a swap channel
* Run the following commands on deployment machine
* Switch to the `nitro-node` directory:
```bash
DEPLOYMENTS_DIR=<path-to-deployments-dir>
cd $DEPLOYMENTS_DIR/nitro-node
```
* Check status of the mirrored channel on L2:
```bash
laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client get-all-ledger-channels -p 4005 -h nitro-node"
# Example output:
# [
# {
# "ID": "0xb34210b763d4fdd534190ba11886ad1daa1e411c87be6fd20cff74cd25077c46",
# "Status": "Open",
# "Balances": [
# {
# "AssetAddress": "0xa4351114dae1abeb2d552d441c9733c72682a45d",
# "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05",
# "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185",
# "MyBalance": 1000,
# "TheirBalance": 1000
# },
# {
# "AssetAddress": "0x314e43f9825b10961859c2a62c2de6a765c1c1f1",
# "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05",
# "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185",
# "MyBalance": 1000,
# "TheirBalance": 1000
# }
# ],
# "ChannelMode": "Open"
# }
# ]
```
* Set required variables:
```bash
export BRIDGE_NITRO_ADDRESS=$(yq eval '.bridge_nitro_address' nitro-node-config.yml)
# Counterparty to create the swap channel with
export COUNTER_PARTY_ADDRESS=<counterparty-nitro-address>
# Get asset addresses from assets.json file
export ASSET_ADDRESS_1=$(jq -r --arg chainId "$CHAIN_ID" '.[$chainId][0].contracts.TestToken.address' assets.json)
export ASSET_ADDRESS_2=$(jq -r --arg chainId "$CHAIN_ID" '.[$chainId][0].contracts.TestToken2.address' assets.json)
```
* Create swap channel:
```bash
laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client swap-fund $COUNTER_PARTY_ADDRESS $BRIDGE_NITRO_ADDRESS --asset "$ASSET_ADDRESS_1:100,100" --asset "$ASSET_ADDRESS_2:100,100" -p 4005 -h nitro-node"
# Expected output
# Objective started SwapFund-0x1dbd58d314f123f4b0f4147eee7fd92fa523ba7082d8a75b846f6d1189e2f0e9
# Channel open 0x1dbd58d314f123f4b0f4147eee7fd92fa523ba7082d8a75b846f6d1189e2f0e9
```
* Export swap channel ID:
```bash
export SWAP_CHANNEL_ID=
```
* Check swap channel:
```bash
laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client get-swap-channel $SWAP_CHANNEL_ID -p 4005 -h nitro-node"
# Expected output:
# {
# ID: '0x1dbd58d314f123f4b0f4147eee7fd92fa523ba7082d8a75b846f6d1189e2f0e9',
# Status: 'Open',
# Balances: [
# {
# AssetAddress: '0xa4351114dae1abeb2d552d441c9733c72682a45d',
# Me: '0x075400039e303b3fb46c0cff0404c5fa61947c05',
# Them: '0xd0ea8b27591b1d070cccd4d30b8d408fe794fdfc',
# MyBalance: 100n,
# TheirBalance: 100n
# },
# {
# AssetAddress: '0x314e43f9825b10961859c2a62c2de6a765c1c1f1',
# Me: '0x075400039e303b3fb46c0cff0404c5fa61947c05',
# Them: '0xd0ea8b27591b1d070cccd4d30b8d408fe794fdfc',
# MyBalance: 100n,
# TheirBalance: 100n
# }
# ]
# }
```
### Performing swaps
* One of the participants can initiate the swap and other one will either accept it or reject it
* For initiating the swap:
```bash
laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client swap-initiate $SWAP_CHANNEL_ID --AssetIn "$ASSET_ADDRESS_1:20" --AssetOut "$ASSET_ADDRESS_2:10" -p 4005 -h nitro-node"
# Expected output:
# {
# SwapAssetsData: {
# TokenIn: '0xa4351114dae1abeb2d552d441c9733c72682a45d',
# TokenOut: '0x314e43f9825b10961859c2a62c2de6a765c1c1f1',
# AmountIn: 20,
# AmountOut: 10
# },
# Channel: '0x1dbd58d314f123f4b0f4147eee7fd92fa523ba7082d8a75b846f6d1189e2f0e9'
# }
```
OR
* For receiving the swap
* Get the pending swap:
```bash
laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client get-pending-swap $SWAP_CHANNEL_ID -p 4005 -h nitro-node"
# Expected output:
# {
# Id: '0x7d582020753335cfd2f2af14127c9b51c7ed7a5d547a674d9cb04fe62de6ddf3',
# ChannelId: '0x1dbd58d314f123f4b0f4147eee7fd92fa523ba7082d8a75b846f6d1189e2f0e9',
# Exchange: {
# TokenIn: '0xa4351114dae1abeb2d552d441c9733c72682a45d',
# TokenOut: '0x314e43f9825b10961859c2a62c2de6a765c1c1f1',
# AmountIn: 20,
# AmountOut: 10
# },
# Sigs: {
# '0': '0x0a018de18a091f7bfb400d9bc64fe958d298882e569c1668c5b1c853b5493221576b2d72074ef6e1899b79e60eaa9934afac5c1e07b7000746bac5b3b1da93311b'
# },
# Nonce: 2840594896360394000
# }
```
* Export swap ID:
```bash
export SWAP_ID=
```
* Either accept or reject the swap
* To accept:
```bash
laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client swap-accept $SWAP_ID -p 4005 -h nitro-node"
# Expected output:
# Confirming Swap with accepted
# Objective complete Swap-0x7d582020753335cfd2f2af14127c9b51c7ed7a5d547a674d9cb04fe62de6ddf3
```
OR
* To reject:
```bash
laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client swap-reject $SWAP_ID -p 4005 -h nitro-node"
# Expected output:
# Confirming Swap with accepted
# Objective complete Swap-0x7d582020753335cfd2f2af14127c9b51c7ed7a5d547a674d9cb04fe62de6ddf3
```
* Check swap channel:
```bash
laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client get-swap-channel $SWAP_CHANNEL_ID -p 4005 -h nitro-node"
# Example output:
# {
# ID: '0x1dbd58d314f123f4b0f4147eee7fd92fa523ba7082d8a75b846f6d1189e2f0e9',
# Status: 'Open',
# Balances: [
# {
# AssetAddress: '0xa4351114dae1abeb2d552d441c9733c72682a45d',
# Me: '0xd0ea8b27591b1d070cccd4d30b8d408fe794fdfc',
# Them: '0x075400039e303b3fb46c0cff0404c5fa61947c05',
# MyBalance: 120n,
# TheirBalance: 80n
# },
# {
# AssetAddress: '0x314e43f9825b10961859c2a62c2de6a765c1c1f1',
# Me: '0xd0ea8b27591b1d070cccd4d30b8d408fe794fdfc',
# Them: '0x075400039e303b3fb46c0cff0404c5fa61947c05',
# MyBalance: 90n,
# TheirBalance: 110n
# }
# ]
# }
```
* Close swap channel:
```bash
laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client swap-defund $SWAP_CHANNEL_ID -p 4005 -h nitro-node"
# Expected output:
# Objective started SwapDefund-0x1dbd58d314f123f4b0f4147eee7fd92fa523ba7082d8a75b846f6d1189e2f0e9
# Objective complete SwapDefund-0x1dbd58d314f123f4b0f4147eee7fd92fa523ba7082d8a75b846f6d1189e2f0e9
```
* Check L2 mirrored channel status:
```bash
laconic-so deployment --dir l2-nitro-deployment exec nitro-rpc-client "nitro-rpc-client get-all-ledger-channels -p 4005 -h nitro-node"
# Example output:
# [
# {
# "ID": "0xb34210b763d4fdd534190ba11886ad1daa1e411c87be6fd20cff74cd25077c46",
# "Status": "Open",
# "Balances": [
# {
# "AssetAddress": "0xa4351114dae1abeb2d552d441c9733c72682a45d",
# "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05",
# "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185",
# "MyBalance": <updated balance>,
# "TheirBalance": <updated balance>
# },
# {
# "AssetAddress": "0x314e43f9825b10961859c2a62c2de6a765c1c1f1",
# "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05",
# "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185",
# "MyBalance": <updated balance>,
# "TheirBalance": <updated balance>
# }
# ],
# "ChannelMode": "Open"
# }
# ]
```
## Clean up ## Clean up
* Switch to deployments dir: * Switch to deployments dir:
@ -443,6 +756,18 @@ Perform payments using a virtual payment channel created with another Nitro node
## Troubleshooting ## Troubleshooting
* Check the logs of nitro node to see if the objective is completed
```bash
# To check logs of L1 nitro-node
laconic-so deployment --dir l1-nitro-deployment logs nitro-node -f --tail 30
# To check logs of L2 nitro-node
laconic-so deployment --dir l2-nitro-deployment logs nitro-node -f --tail 30
```
* If the objective is completed, you can safely stop (`Ctrl+C`) the running CLI command and continue with the further instructions
* Stop (`Ctrl+C`) the direct-fund command if it is stuck * Stop (`Ctrl+C`) the direct-fund command if it is stuck
* Restart the L1 Nitro node: * Restart the L1 Nitro node: