From 81923f53232aecd289e955dfd998600b50e38b6a Mon Sep 17 00:00:00 2001 From: nabarun Date: Mon, 21 Oct 2024 11:07:01 +0000 Subject: [PATCH] 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 Reviewed-on: https://git.vdb.to/cerc-io/testnet-laconicd-stack/pulls/30 --- README.md | 1 + ops/deployments-from-scratch.md | 179 ++++++++++++-- ops/nitro-token-ops.md | 63 +++++ ops/stage2/assets.json | 16 ++ ops/stage2/nitro-node-config.yml | 9 +- testnet-nitro-node.md | 411 +++++++++++++++++++++++++++---- 6 files changed, 604 insertions(+), 75 deletions(-) create mode 100644 ops/nitro-token-ops.md create mode 100644 ops/stage2/assets.json diff --git a/README.md b/README.md index ac60865..ea70127 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ Stacks to run a node for laconic testnet - [Update deployments after code changes](./ops/update-deployments.md) - [Halt stage0 and start stage1](./ops/stage0-to-stage1.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 diff --git a/ops/deployments-from-scratch.md b/ops/deployments-from-scratch.md index 3f26698..2833ba9 100644 --- a/ops/deployments-from-scratch.md +++ b/ops/deployments-from-scratch.md @@ -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) +
+ Fixturenet Eth + +## Fixturenet Eth + +* Stack: + +* 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 + ``` + +
+
Nitro Contracts Deployment @@ -47,6 +155,7 @@ # Remove the deployment dir sudo rm -rf nitro-contracts-deployment + ``` ### Setup @@ -65,21 +174,21 @@ * Edit [`contract-vars.yml`](./contract-vars.yml) and fill in the following values: ```bash - # L1 RPC endpoint - geth_url: "https://sepolia.laconic.com" + # RPC endpoint + geth_url: "https://fixturenet-eth.laconic.com" - # L1 chain ID (Sepolia: 11155111) - geth_chain_id: "11155111" + # Chain ID (Fixturenet-eth: 1212) + geth_chain_id: "1212" # 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 - geth_deployer_pk: "" - # Custom L1 token to be deployed - token_name: "" - token_symbol: "" - intial_token_supply: "" + geth_deployer_pk: "888814df89c4358d7ddb3fa4b0213e7331239a80e1f013eaa7b2deca2a41a218" + + # Custom token to be deployed + token_name: "TestToken" + token_symbol: "TST" + initial_token_supply: "129600" ``` * Update the target dir in `setup-vars.yml`: @@ -142,6 +251,8 @@ 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) +
@@ -178,10 +289,10 @@ # Expected output: # { - # "11155111": [ + # "1212": [ # { # "name": "geth", - # "chainId": "11155111", + # "chainId": "1212", # "contracts": { # "ConsensusApp": { # "address": "0xC98aD0B41B9224dad0605be32A9241dB9c67E2e8" @@ -192,7 +303,7 @@ # "VirtualPaymentApp": { # "address": "0x778e4e6297E8BF04C67a20Ec989618d72eB4a19E" # }, - # "Token": { + # "TestToken": { # "address": "0x02ebfB2706527C7310F2a7d9098b2BC61014C5F2" # } # } @@ -217,16 +328,16 @@ ```bash # WS endpoint - nitro_chain_url: "wss://sepolia.laconic.com" + nitro_chain_url: "wss://fixturenet-eth.laconic.com" # Private key for bridge Nitro address nitro_sc_pk: "" # 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 - nitro_chain_pk: "" + nitro_chain_pk: "888814df89c4358d7ddb3fa4b0213e7331239a80e1f013eaa7b2deca2a41a218" - # Deployed L1 Nitro contract addresses + # Deployed Nitro contract addresses na_address: "" vpa_address: "" ca_address: "" @@ -298,14 +409,12 @@ cd /srv/bridge # 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 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 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_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 L2_BRIDGE_MULTIADDR="/dns4/bridge.laconic.com/tcp/3006/p2p/$BRIDGE_PEER_ID" - # Create the required config file + # Create the required config files cat < nitro-node-config.yml - nitro_chain_url: "wss://sepolia.laconic.com" + nitro_chain_url: "wss://fixturenet-eth.laconic.com" na_address: "$NA_ADDRESS" ca_address: "$CA_ADDRESS" vpa_address: "$VPA_ADDRESS" - asset_address: "${ASSET_ADDRESS}" bridge_nitro_address: "$BRIDGE_NITRO_ADDRESS" nitro_l1_bridge_multiaddr: "$L1_BRIDGE_MULTIADDR" nitro_l2_bridge_multiaddr: "$L2_BRIDGE_MULTIADDR" 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: ```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" ```
@@ -1006,8 +1129,10 @@ https://wallet.laconic.com -> 5000 https://loro-console.laconic.com -> 4001 # Machine 2 -https://sepolia.laconic.com -> 8545 -wss://sepolia.laconic.com -> 8546 +https://sepolia.laconic.com -> 8545 +wss://sepolia.laconic.com -> 8546 +https://fixturenet-eth.laconic.com -> 7545 +wss://fixturenet-eth.laconic.com -> 7546 bridge.laconic.com Open ports: diff --git a/ops/nitro-token-ops.md b/ops/nitro-token-ops.md new file mode 100644 index 0000000..092446a --- /dev/null +++ b/ops/nitro-token-ops.md @@ -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="" + 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="" + export 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" + ``` diff --git a/ops/stage2/assets.json b/ops/stage2/assets.json new file mode 100644 index 0000000..c8f43b9 --- /dev/null +++ b/ops/stage2/assets.json @@ -0,0 +1,16 @@ +{ + "1212": [ + { + "name": "geth", + "chainId": "1212", + "contracts": { + "TestToken": { + "address": "0x2b79F4a92c177B4E61F5c4AC37b1B8A623c665A4" + }, + "TestToken2": { + "address": "0xa6B4B8b84576047A53255649b4994743d9C83A71" + } + } + } + ] +} diff --git a/ops/stage2/nitro-node-config.yml b/ops/stage2/nitro-node-config.yml index 50aa188..ca975ea 100644 --- a/ops/stage2/nitro-node-config.yml +++ b/ops/stage2/nitro-node-config.yml @@ -1,8 +1,7 @@ -nitro_chain_url: "wss://sepolia.laconic.com" -na_address: "0xfD5276DDfE0E7738Af5F3dA0dE58D36560BbE544" -ca_address: "0xC71F47d58d521aE24FDf5e324969aCD6f83b6Ff8" -vpa_address: "0xEA55dEab3718CF4d084a94Fe4C0D750a80Eb1F2C" -asset_address: "0xa4351114dAE1aBEb2d552d441C9733c72682a45D" +nitro_chain_url: "wss://fixturenet-eth.laconic.com" +na_address: "0x2B6AFbd4F479cE4101Df722cF4E05F941523EaD9" +ca_address: "0xBca48057Da826cB2eb1258E2C679678b269dC262" +vpa_address: "0xCf5207018766587b8cBad4B8B1a1a38c225ebA7A" bridge_nitro_address: "0xf0E6a85C6D23AcA9ff1b83477D426ed26F218185" nitro_l1_bridge_multiaddr: "/dns4/bridge.laconic.com/tcp/3005/p2p/16Uiu2HAky2PYTfBNHpytybz4ADY9n7boiLgK5btJpTrGVbWC3diZ" nitro_l2_bridge_multiaddr: "/dns4/bridge.laconic.com/tcp/3006/p2p/16Uiu2HAky2PYTfBNHpytybz4ADY9n7boiLgK5btJpTrGVbWC3diZ" diff --git a/testnet-nitro-node.md b/testnet-nitro-node.md index 997c0f7..05af47d 100644 --- a/testnet-nitro-node.md +++ b/testnet-nitro-node.md @@ -35,12 +35,35 @@ # na_address: "" # ca_address: "" # vpa_address: "" - # asset_address: "" # bridge_nitro_address: "" # nitro_l1_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 * 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 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: @@ -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: ```bash - # Set amount to ledger - 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" + 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" # 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 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', - # Balance: { - # AssetAddress: '', - # Me: '', - # Them: '', - # MyBalance: n, - # TheirBalance: n - # }, + # Balances: [ + # { + # AssetAddress: '0xa6b4b8b84576047a53255649b4994743d9c83a71', + # Me: '0xdaaa6ef3bc03f9c7dabc9a02847387d2c19107f5', + # Them: '0xf0e6a85c6d23aca9ff1b83477d426ed26f218185', + # MyBalance: 1000n, + # TheirBalance: 1000n + # }, + # { + # AssetAddress: '0x0000000000000000000000000000000000000000', + # Me: '0xdaaa6ef3bc03f9c7dabc9a02847387d2c19107f5', + # Them: '0xf0e6a85c6d23aca9ff1b83477d426ed26f218185', + # MyBalance: 1000n, + # TheirBalance: 1000n + # } + # ], # ChannelMode: 'Open' # } ``` @@ -254,18 +286,27 @@ Create a ledger channel with the bridge on L1 which is mirrored 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" - # Expected output: + # Example output: # [ # { - # "ID": "0x6a9f5ccf1fa802525d794f4a899897f947615f6acc7141e61e056a8bfca29179", + # "ID": "0xb34210b763d4fdd534190ba11886ad1daa1e411c87be6fd20cff74cd25077c46", # "Status": "Open", - # "Balance": { - # "AssetAddress": "", - # "Me": "", - # "Them": "", - # "MyBalance": n, - # "TheirBalance": n - # }, + # "Balances": [ + # { + # "AssetAddress": "0xa4351114dae1abeb2d552d441c9733c72682a45d", + # "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05", + # "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185", + # "MyBalance": 1000, + # "TheirBalance": 1000 + # }, + # { + # "AssetAddress": "0x314e43f9825b10961859c2a62c2de6a765c1c1f1", + # "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05", + # "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185", + # "MyBalance": 1000, + # "TheirBalance": 1000 + # } + # ], # "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 +* 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 * Switch to the `nitro-node` directory: @@ -290,18 +335,27 @@ Perform payments using a virtual payment channel created with another Nitro node ```bash 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", - # "Balance": { - # "AssetAddress": "", - # "Me": "", - # "Them": "", - # "MyBalance": Xn, - # "TheirBalance": Yn - # }, + # "Balances": [ + # { + # "AssetAddress": "0xa4351114dae1abeb2d552d441c9733c72682a45d", + # "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05", + # "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185", + # "MyBalance": 1000, + # "TheirBalance": 1000 + # }, + # { + # "AssetAddress": "0x314e43f9825b10961859c2a62c2de6a765c1c1f1", + # "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05", + # "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185", + # "MyBalance": 1000, + # "TheirBalance": 1000 + # } + # ], # "ChannelMode": "Open" # } # ] @@ -319,7 +373,7 @@ Perform payments using a virtual payment channel created with another Nitro node export L2_CHANNEL_ID= # 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: @@ -396,18 +450,27 @@ Perform payments using a virtual payment channel created with another Nitro node ```bash 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", - # "Balance": { - # "AssetAddress": "", - # "Me": "", - # "Them": "", - # "MyBalance": n, - # "TheirBalance": n - # }, + # "Balances": [ + # { + # "AssetAddress": "0xa4351114dae1abeb2d552d441c9733c72682a45d", + # "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05", + # "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185", + # "MyBalance": , + # "TheirBalance": + # }, + # { + # "AssetAddress": "0x314e43f9825b10961859c2a62c2de6a765c1c1f1", + # "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05", + # "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185", + # "MyBalance": , + # "TheirBalance": + # } + # ], # "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 +## 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= + + 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= + + # 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": , + # "TheirBalance": + # }, + # { + # "AssetAddress": "0x314e43f9825b10961859c2a62c2de6a765c1c1f1", + # "Me": "0x075400039e303b3fb46c0cff0404c5fa61947c05", + # "Them": "0xf0e6a85c6d23aca9ff1b83477d426ed26f218185", + # "MyBalance": , + # "TheirBalance": + # } + # ], + # "ChannelMode": "Open" + # } + # ] + ``` + ## Clean up * Switch to deployments dir: @@ -443,6 +756,18 @@ Perform payments using a virtual payment channel created with another Nitro node ## 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 * Restart the L1 Nitro node: