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: