Instructions to run instances of ts-nitro
clients in NodeJS and browser environments and create a ledger channel between them
Run relay node using v2 watcher
-
Clone
ts-nitro
repo in a separate directory which will be used for running the client in browser environment -
In the first repo follow steps from server readme setup for NodeJS environment client
-
In second repo follow these steps:
-
In root of the repo, install depedencies:
yarn
-
Copy the deployed contract addresses from 1st repo
cp <PATH_TO_FIRST_REPO>/packages/nitro-util/nitro-addresses.json <PATH_TO_SECOND_REPO>/packages/example-web-app/src/nitro-addresses.json
-
Build packages for browser environment
yarn build:browser --ignore @cerc-io/example-web-app
-
Set the relay node multiaddr in example-web-app .env
-
Run browser app in dev mode
cd packages/example-web-app yarn start
-
-
Open app in browser
-
Open console in browser inspect and enable debug logs by setting
localStorage.debug = 'ts-nitro:*'
-
Refresh the app for enabling logs
-
Setup client
const nitro = await setupNode('charlie')
-
Assign private keys of Bob to variables
# In packages/server export BOB_PK=0279651921cd800ac560c21ceea27aab0107b67daf436cdd25ce84cad30159b4 export BOB_CHAIN_PK=59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d export CHARLIE_ADDRESS=0x67D5b55604d1aF90074FcB69b8C51838FFF84f8d
-
Run the client for Bob (
0xBBB676f9cFF8D242e9eaC39D063848807d3D1D94
) and pass in Charlie’s address as a counterparty to create the ledger channel with::# In packages/server yarn cli --pk $BOB_PK --chain-pk $BOB_CHAIN_PK --use-durable-store true --durable-store-folder ./out/bob-db --direct-fund --counter-party $CHARLIE_ADDRESS --get-ledger-channel --amount 1000000 # Expected output: # ts-nitro:engine Constructed Engine +0ms # ts-nitro:server Started P2PMessageService +0ms # . # ts-nitro:engine Objective DirectFunding-0x82153f26fcbe95d5add755d0bfe63ef5940615a8a7fd6ec65822339300e4e268 is complete & returned to API +35ms # ts-nitro:server Ledger channel created with id 0x82153f26fcbe95d5add755d0bfe63ef5940615a8a7fd6ec65822339300e4e268 +6s
-
Assign ledger channel id in output log above to an environment variable
export LEDGER_CHANNEL_ID=<LEDGER_CHANNEL_ID>
-
Run client for Bob again to create virtual payment channel:
yarn cli --pk $BOB_PK --chain-pk $BOB_CHAIN_PK --use-durable-store true --durable-store-folder ./out/bob-db --virtual-fund --counter-party $CHARLIE_ADDRESS --get-payment-channel --amount 1000 # Final Expected output: # ts-nitro:engine Objective VirtualFund-0xf112143060c59a6d2c5b2d429ca46eb48286e1ca1301da60b9a1a184ad1a58bb is complete & returned to API +1ms # ts-nitro:server Virtual payment channel created with id 0xf112143060c59a6d2c5b2d429ca46eb48286e1ca1301da60b9a1a184ad1a58bb +999ms
-
Assign payment channel id in output log above to an environment variable
export PAYMENT_CHANNEL_ID=<PAYMENT_CHANNEL_ID>
-
Run client for Bob to make payment:
yarn cli --pk $BOB_PK --chain-pk $BOB_CHAIN_PK --use-durable-store true --durable-store-folder ./out/bob-db --pay --amount 50 --payment-channel $PAYMENT_CHANNEL_ID --wait
- Wait for voucher received log in client Charlie
-
Check status of payment channel after making payments in browser
out(await nitro.getPaymentChannel("<$PAYMENT_CHANNEL_ID>"))
-
Close virtual payment channel using client Bob
yarn cli --pk $BOB_PK --chain-pk $BOB_CHAIN_PK --use-durable-store true --durable-store-folder ./out/bob-db --virtual-defund --payment-channel $PAYMENT_CHANNEL_ID --get-payment-channel # Final Expected output: # ts-nitro:engine Objective VirtualDefund-0xe613b9f1651f971473061a968823463e9570b83230c2bce734b21800f663e4aa is complete & returned to API +1ms # ts-nitro:server Virtual payment channel with id 0xe613b9f1651f971473061a968823463e9570b83230c2bce734b21800f663e4aa closed
-
Close the ledger channel using client Bob
yarn cli --pk $BOB_PK --chain-pk $BOB_CHAIN_PK --use-durable-store true --durable-store-folder ./out/bob-db --direct-defund --ledger-channel $LEDGER_CHANNEL_ID --get-ledger-channel # Final Expected output: # ts-nitro:engine Objective DirectDefunding-0xe29e2d7ee060fb78b279ac4c8f5cc9bf59334f3e0d25315d5e3c822ed0303d9e is complete & returned to API +1ms # ts-nitro:server Ledger channel with id 0xe29e2d7ee060fb78b279ac4c8f5cc9bf59334f3e0d25315d5e3c822ed0303d9e closed
-
Check balance of accounts on chain
# Bob's balance echo $( printf "Result: %d" $( curl -sk -X GET -H "Content-Type: application/json" --data '{ "jsonrpc":"2.0", "method":"eth_getBalance", "params": ["0xBBB676f9cFF8D242e9eaC39D063848807d3D1D94", "latest"], "id":1 }' http://localhost:8545 | jq -r '.result' ) ) # Expected output: # Result: 2000000 # Charlie's balance echo $( printf "Result: %d" $( curl -sk -X GET -H "Content-Type: application/json" --data '{ "jsonrpc":"2.0", "method":"eth_getBalance", "params": ["0x67D5b55604d1aF90074FcB69b8C51838FFF84f8d", "latest"], "id":1 }' http://localhost:8545 | jq -r '.result' ) ) # Expected output: # Result: 1000050
-
In NodeJS environment clear storage by deleting DB directories in
/packages/server
rm -r ./out
-
In browser apps call
clearClientStorage
method to delete all indexedDBsclearNodeStorage()