From 5ddffd8bc37876d24af420db6243621ffd0921bc Mon Sep 17 00:00:00 2001 From: Shreerang Kale Date: Fri, 18 Oct 2024 19:02:39 +0530 Subject: [PATCH] Add steps to perform swaps --- ops/deployments-from-scratch.md | 21 +- ops/stage2/assets.json | 16 ++ testnet-nitro-node.md | 374 ++++++++++++++++++++++++++++---- 3 files changed, 359 insertions(+), 52 deletions(-) create mode 100644 ops/stage2/assets.json diff --git a/ops/deployments-from-scratch.md b/ops/deployments-from-scratch.md index 2408e5b..bff8bb5 100644 --- a/ops/deployments-from-scratch.md +++ b/ops/deployments-from-scratch.md @@ -268,8 +268,9 @@ * To transfer a token to an account: ```bash - # Note: Replace `` with name of the token to be tranferred (e.g. TestToken2) - export ASSET_ADDRESS=$(laconic-so deployment --dir nitro-contracts-deployment exec nitro-contracts "jq -r '.\"{{ geth_chain_id }}\"[0].contracts..address' /app/deployment/nitro-addresses.json") + 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="" @@ -456,20 +457,20 @@ 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): [ + 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 + \"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)) + | map(select(.key | in({\"ConsensusApp\":1, \"NitroAdjudicator\":1, \"VirtualPaymentApp\":1}) | not)) | from_entries ) } ] - }' /app/deployment/nitro-addresses.json") > assets.json + }' /app/deployment/nitro-addresses.json" > assets.json ``` * The required config files should be generated at `/srv/bridge/nitro-node-config.yml` and `/srv/bridge/assets.json` 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/testnet-nitro-node.md b/testnet-nitro-node.md index d9eff2a..ca498e4 100644 --- a/testnet-nitro-node.md +++ b/testnet-nitro-node.md @@ -207,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: @@ -223,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 @@ -257,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' # } ``` @@ -277,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" # } # ] @@ -298,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: @@ -313,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" # } # ] @@ -342,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: @@ -419,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" # } # ] @@ -438,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: