Migration E2E Testing (LocalNet)
- Verify this flow E2E
- Add one-liners on expected checks/outputs along the way
- You must already know what
pocket
,pocketd
, andLocalNet
are. - If you are not a developer/operator, stop here.
Goal of this document:
- Manually test Supplier Claiming on LocalNet with clear, step-by-step, copy-pasteable commands.
- This guide is idiot-proofed: every step is explicit, warnings are surfaced, and copy-paste actions are clearly marked.
Quick Navigation
Prerequisites
pocket
must be installedpocketd
must be installed- You must know how to run a shannon
LocalNet
- You need access to a shell with
jq
,sed
, andmake
Morse Setup (pocket
)
Morse Account Preparation
Create 6 Accounts with these roles:
- (1) PNF & Validator (same address for both)
- (2-4) Operators (suppliers)
- (5-6) Owners (outputs)
for i in {1..6}; do pocket accounts create --datadir ./morse_pocket_datadir; done
When prompted for a password, just press Enter (leave it empty).
Verify accounts were created:
pocket accounts list --datadir ./morse_pocket_datadir
You should see 6 addresses. Example:
(0) 1c9d96c0bd1a98c90151a804f18e9ba75dae12b4
(1) 86ff8ecdce4c93def67d018967fcbeebfed253bf
(2) 96b41ff38115b23d34e0201a16953a9088243bf3
(3) a1bc4dc57ca80a58953fea7438cedba2b4141abe
(4) dda8fe050d21511dd3b58bf5b6d81428573bc986
(5) f761c00d797baa4a3ac9b7d7248394c412d1e047
Assign addresses to variables
Assign addresses to variables using the actual values (example shown below; use your real output if different):
MORSE_ADDR_PNF="1c9d96c0bd1a98c90151a804f18e9ba75dae12b4"
MORSE_ADDR_SUPPLIER_1="86ff8ecdce4c93def67d018967fcbeebfed253bf"
MORSE_ADDR_SUPPLIER_2="96b41ff38115b23d34e0201a16953a9088243bf3"
MORSE_ADDR_SUPPLIER_3="a1bc4dc57ca80a58953fea7438cedba2b4141abe"
MORSE_ADDR_OWNER_1="dda8fe050d21511dd3b58bf5b6d81428573bc986"
MORSE_ADDR_OWNER_2="f761c00d797baa4a3ac9b7d7248394c412d1e047"
⚠️ Double check you use the right address for each variable. Copy-paste with care!
Export keys:
pocket accounts export $MORSE_ADDR_SUPPLIER_1 --datadir ./morse_pocket_datadir
pocket accounts export $MORSE_ADDR_SUPPLIER_2 --datadir ./morse_pocket_datadir
pocket accounts export $MORSE_ADDR_SUPPLIER_3 --datadir ./morse_pocket_datadir
pocket accounts export $MORSE_ADDR_OWNER_1 --datadir ./morse_pocket_datadir
pocket accounts export $MORSE_ADDR_OWNER_2 --datadir ./morse_pocket_datadir
This creates several pocket-account-*.json
files in your current directory.
Check files exist:
ls -la pocket-account*
Retrieve their public keys:
pocket accounts show $MORSE_ADDR_PNF --datadir ./morse_pocket_datadir
pocket accounts show $MORSE_ADDR_SUPPLIER_1 --datadir ./morse_pocket_datadir
pocket accounts show $MORSE_ADDR_SUPPLIER_2 --datadir ./morse_pocket_datadir
pocket accounts show $MORSE_ADDR_SUPPLIER_3 --datadir ./morse_pocket_datadir
pocket accounts show $MORSE_ADDR_OWNER_1 --datadir ./morse_pocket_datadir
pocket accounts show $MORSE_ADDR_OWNER_2 --datadir ./morse_pocket_datadir
Assign the public keys to variables using the actual values (example shown below; use your real output if different):
MORSE_PNF_PUBKEY="765c466ba9fdd182a0e4fb1c5968aaa0a76f00caea06d0cfbfd524366c85433a"
MORSE_SUPPLIER_PUBKEY_1="7a9d685014154504e302af75f36986e31ce7cd1b3e7fd6e27a13ce04c003b333"
MORSE_SUPPLIER_PUBKEY_2="6916b93ee96e8cee6774edf23c908f79a3372eba91ccd15e62c16c6658669056"
MORSE_SUPPLIER_PUBKEY_3="27f16c70ad256af90b8b35cd021d6e4b05dc6b770e3d862d45d8cda9e00b79d8"
MORSE_OWNER_PUBKEY_1="da23b83d40485c506a692804f6a50b11e4bffceb492e5e1dfda5829cabc7c1e2"
MORSE_OWNER_PUBKEY_2="7aa876179e5b2acd4c69dd359b075dfb9a614ac7567097fb324658f94b2563c6"
⚠️ Double check all assignments!
Morse State Preparation
Copy the example state file:
cp \
docusaurus/docs/2_explore/4_morse_migration/example_state_export.json \
localnet_testing_state_export.json
Replace placeholder variables in the new file:
sed -i.bak -e "s/\"MORSE_ADDR_PNF\"/\"$MORSE_ADDR_PNF\"/g" \
-e "s/\"MORSE_ADDR_SUPPLIER_1\"/\"$MORSE_ADDR_SUPPLIER_1\"/g" \
-e "s/\"MORSE_ADDR_SUPPLIER_2\"/\"$MORSE_ADDR_SUPPLIER_2\"/g" \
-e "s/\"MORSE_ADDR_SUPPLIER_3\"/\"$MORSE_ADDR_SUPPLIER_3\"/g" \
-e "s/\"MORSE_ADDR_OWNER_1\"/\"$MORSE_ADDR_OWNER_1\"/g" \
-e "s/\"MORSE_ADDR_OWNER_2\"/\"$MORSE_ADDR_OWNER_2\"/g" \
-e "s/\"MORSE_PNF_PUBKEY\"/\"$MORSE_PNF_PUBKEY\"/g" \
-e "s/\"MORSE_SUPPLIER_PUBKEY_1\"/\"$MORSE_SUPPLIER_PUBKEY_1\"/g" \
-e "s/\"MORSE_SUPPLIER_PUBKEY_2\"/\"$MORSE_SUPPLIER_PUBKEY_2\"/g" \
-e "s/\"MORSE_SUPPLIER_PUBKEY_3\"/\"$MORSE_SUPPLIER_PUBKEY_3\"/g" \
-e "s/\"MORSE_OWNER_PUBKEY_1\"/\"$MORSE_OWNER_PUBKEY_1\"/g" \
-e "s/\"MORSE_OWNER_PUBKEY_2\"/\"$MORSE_OWNER_PUBKEY_2\"/g" \
localnet_testing_state_export.json
Generate import message:
pocketd tx migration collect-morse-accounts \
localnet_testing_state_export.json localnet_testing_msg_import_morse_accounts.json \
--home=./localnet/pocketd
- This creates
localnet_testing_msg_import_morse_accounts.json
. - (Optional) Inspect the file if you want to verify contents.
State Upload
Start LocalNet:
make localnet_up
make acc_initialize_pubkeys
Wait for all services to be fully up before continuing.
Upload Morse state:
pocketd tx migration import-morse-accounts \
localnet_testing_msg_import_morse_accounts.json \
--from=pnf \
--home=./localnet/pocketd --keyring-backend=test \
--network=local \
--gas=auto --gas-adjustment=1.5
⚠️ This command does not output anything. If it returns to prompt, it likely succeeded.
Check claimable accounts:
pocketd query migration list-morse-claimable-account \
-o json --network=local \
--home=./localnet/pocketd
⚠️ You should see exactly 6 accounts in the output! If not, something is wrong.
Example output:
...
{
"morse_src_address": "F761C00D797BAA4A3AC9B7D7248394C412D1E047",
"unstaked_balance": {
"denom": "upokt",
"amount": "20000000000000"
},
"supplier_stake": {
"denom": "upokt",
"amount": "0"
},
"application_stake": {
"denom": "upokt",
"amount": "0"
}
}
...
Shannon Setup (pocketd
)
Shannon Account Preparation
Create prefix variables:
MORSE_SUPPLIER_1_PREFIX=${MORSE_ADDR_SUPPLIER_1:0:4}
MORSE_SUPPLIER_2_PREFIX=${MORSE_ADDR_SUPPLIER_2:0:4}
MORSE_SUPPLIER_3_PREFIX=${MORSE_ADDR_SUPPLIER_3:0:4}
MORSE_OWNER_1_PREFIX=${MORSE_ADDR_OWNER_1:0:4}
MORSE_OWNER_2_PREFIX=${MORSE_ADDR_OWNER_2:0:4}
Create 5 new Shannon accounts (3 suppliers, 2 owners):
pocketd --keyring-backend=test --home=./localnet/pocketd keys add ${MORSE_SUPPLIER_1_PREFIX}-claim-supplier-1
pocketd --keyring-backend=test --home=./localnet/pocketd keys add ${MORSE_SUPPLIER_2_PREFIX}-claim-supplier-2
pocketd --keyring-backend=test --home=./localnet/pocketd keys add ${MORSE_SUPPLIER_3_PREFIX}-claim-supplier-3
pocketd --keyring-backend=test --home=./localnet/pocketd keys add ${MORSE_OWNER_1_PREFIX}-claim-owner-1
pocketd --keyring-backend=test --home=./localnet/pocketd keys add ${MORSE_OWNER_2_PREFIX}-claim-owner-2
Export addresses:
SHANNON_ADDR_SUPPLIER_1=$(pocketd --keyring-backend=test --home=./localnet/pocketd keys show ${MORSE_SUPPLIER_1_PREFIX}-claim-supplier-1 -a)
SHANNON_ADDR_SUPPLIER_2=$(pocketd --keyring-backend=test --home=./localnet/pocketd keys show ${MORSE_SUPPLIER_2_PREFIX}-claim-supplier-2 -a)
SHANNON_ADDR_SUPPLIER_3=$(pocketd --keyring-backend=test --home=./localnet/pocketd keys show ${MORSE_SUPPLIER_3_PREFIX}-claim-supplier-3 -a)
SHANNON_ADDR_OWNER_1=$(pocketd --keyring-backend=test --home=./localnet/pocketd keys show ${MORSE_OWNER_1_PREFIX}-claim-owner-1 -a)
SHANNON_ADDR_OWNER_2=$(pocketd --keyring-backend=test --home=./localnet/pocketd keys show ${MORSE_OWNER_2_PREFIX}-claim-owner-2 -a)
These variables will be used in all subsequent steps.
Fund all accounts:
pocketd tx bank send pnf $SHANNON_ADDR_SUPPLIER_1 1000000000000upokt --home=./localnet/pocketd --yes --unordered --timeout-duration=5s
pocketd tx bank send pnf $SHANNON_ADDR_SUPPLIER_2 1000000000000upokt --home=./localnet/pocketd --yes --unordered --timeout-duration=5s
pocketd tx bank send pnf $SHANNON_ADDR_SUPPLIER_3 1000000000000upokt --home=./localnet/pocketd --yes --unordered --timeout-duration=5s
pocketd tx bank send pnf $SHANNON_ADDR_OWNER_1 1000000000000upokt --home=./localnet/pocketd --yes --unordered --timeout-duration=5s
pocketd tx bank send pnf $SHANNON_ADDR_OWNER_2 1000000000000upokt --home=./localnet/pocketd --yes --unordered --timeout-duration=5s
If any command fails, stop and debug before continuing.
Check balances:
pocketd query bank balances $SHANNON_ADDR_SUPPLIER_1 --home ./localnet/pocketd
pocketd query bank balances $SHANNON_ADDR_SUPPLIER_2 --home ./localnet/pocketd
pocketd query bank balances $SHANNON_ADDR_SUPPLIER_3 --home ./localnet/pocketd
pocketd query bank balances $SHANNON_ADDR_OWNER_1 --home ./localnet/pocketd
pocketd query bank balances $SHANNON_ADDR_OWNER_2 --home ./localnet/pocketd
Each account should show a balance. If not, fix before proceeding.
Option 1: Supplier Claim WITH Output Address - Signed by Owner
Create config:
cat <<EOF > ${MORSE_SUPPLIER_1_PREFIX}_claim_supplier_1_supplier_config.yaml
owner_address: ${SHANNON_ADDR_OWNER_1}
operator_address: ${SHANNON_ADDR_SUPPLIER_1}
default_rev_share_percent:
${SHANNON_ADDR_OWNER_1}: 80
${SHANNON_ADDR_SUPPLIER_1}: 20
services:
- service_id: anvil
endpoints:
- publicly_exposed_url: http://relayminer1:8545
rpc_type: JSON_RPC
EOF
Check stake before claim:
pocketd query supplier show-supplier $SHANNON_ADDR_SUPPLIER_1 -o json --network=local --home=./localnet/pocketd | jq '.supplier.stake.amount'
This should error (supplier doesn't exist yet).
Check owner's unstaked balance before claim:
pocketd query bank balance $SHANNON_ADDR_OWNER_1 upokt -o json --network=local --home=./localnet/pocketd | jq '.balance.amount'
Check supplier's unstaked balance before claim:
pocketd query bank balance $SHANNON_ADDR_SUPPLIER_1 upokt -o json --network=local --home=./localnet/pocketd | jq '.balance.amount'
Submit the onchain claim:
pocketd tx migration claim-supplier \
${MORSE_ADDR_SUPPLIER_1} pocket-account-${MORSE_ADDR_OWNER_1}.json \
${MORSE_SUPPLIER_1_PREFIX}_claim_supplier_1_supplier_config.yaml \
--from=${MORSE_OWNER_1_PREFIX}-claim-owner-1 \
--network=local \
--home=./localnet/pocketd --keyring-backend=test --no-passphrase \
--gas=auto --gas-adjustment=1.5 --yes
If this fails, do not continue until resolved.
Verify supplier exists onchain:
pocketd query supplier show-supplier $SHANNON_ADDR_SUPPLIER_1 -o json --network=local --home=./localnet/pocketd
Check stake after claim:
pocketd query supplier show-supplier $SHANNON_ADDR_SUPPLIER_1 -o json --network=local --home=./localnet/pocketd | jq '.supplier.stake.amount'
Check owner's unstaked balance after claim:
pocketd query bank balance $SHANNON_ADDR_OWNER_1 upokt -o json --network=local --home=./localnet/pocketd | jq '.balance.amount'
Check supplier's unstaked balance after claim:
pocketd query bank balance $SHANNON_ADDR_SUPPLIER_1 upokt -o json --network=local --home=./localnet/pocketd | jq '.balance.amount'
Option 2: Supplier Claim WITH Output Address - Signed by Operator
Create config:
cat <<EOF > ${MORSE_SUPPLIER_2_PREFIX}_claim_supplier_2_supplier_config.yaml
owner_address: ${SHANNON_ADDR_OWNER_2}
operator_address: ${SHANNON_ADDR_SUPPLIER_2}
default_rev_share_percent:
${SHANNON_ADDR_OWNER_2}: 80
${SHANNON_ADDR_SUPPLIER_2}: 20
services:
- service_id: anvil
endpoints:
- publicly_exposed_url: http://relayminer1:8545
rpc_type: JSON_RPC
EOF
Check stake before claim:
pocketd query supplier show-supplier $SHANNON_ADDR_SUPPLIER_2 -o json --network=local --home=./localnet/pocketd | jq '.supplier.stake.amount'
This should error (supplier doesn't exist yet)..
Check owner's unstaked balance before claim:
pocketd query bank balance $SHANNON_ADDR_OWNER_2 upokt -o json --network=local --home=./localnet/pocketd | jq '.balance.amount'
Check supplier's unstaked balance before claim:
pocketd query bank balance $SHANNON_ADDR_SUPPLIER_2 upokt -o json --network=local --home=./localnet/pocketd | jq '.balance.amount'
Submit the onchain claim:
pocketd tx migration claim-supplier \
${MORSE_ADDR_SUPPLIER_2} pocket-account-${MORSE_ADDR_SUPPLIER_2}.json \
${MORSE_SUPPLIER_2_PREFIX}_claim_supplier_2_supplier_config.yaml \
--from=${MORSE_SUPPLIER_2_PREFIX}-claim-supplier-2 \
--network=local \
--home=./localnet/pocketd --keyring-backend=test --no-passphrase \
--gas=auto --gas-adjustment=1.5 --yes
Verify supplier exists onchain:
pocketd query supplier show-supplier $SHANNON_ADDR_SUPPLIER_2 -o json --network=local --home=./localnet/pocketd
Check stake after claim:
pocketd query supplier show-supplier $SHANNON_ADDR_SUPPLIER_2 -o json --network=local --home=./localnet/pocketd | jq '.supplier.stake.amount'
Check owner's unstaked balance after claim:
pocketd query bank balance $SHANNON_ADDR_OWNER_2 upokt -o json --network=local --home=./localnet/pocketd | jq '.balance.amount'
Check supplier's unstaked balance after claim:
pocketd query bank balance $SHANNON_ADDR_SUPPLIER_2 upokt -o json --network=local --home=./localnet/pocketd | jq '.balance.amount'
Option 3: Supplier Claim WITHOUT Output Address
Create config:
cat <<EOF > ${MORSE_SUPPLIER_3_PREFIX}_claim_supplier_3_supplier_config.yaml
owner_address: ${SHANNON_ADDR_SUPPLIER_3}
operator_address: ${SHANNON_ADDR_SUPPLIER_3}
default_rev_share_percent:
${SHANNON_ADDR_SUPPLIER_3}: 100
services:
- service_id: anvil
endpoints:
- publicly_exposed_url: http://relayminer1:8545
rpc_type: JSON_RPC
EOF
Check stake before claim:
pocketd query supplier show-supplier $SHANNON_ADDR_SUPPLIER_3 -o json --network=local --home=./localnet/pocketd | jq '.supplier.stake.amount'
This should error (supplier doesn't exist yet)..
Check unstaked balance before claim:
pocketd query bank balance $SHANNON_ADDR_SUPPLIER_3 upokt -o json --network=local --home=./localnet/pocketd | jq '.balance.amount'
Submit the onchain claim:
pocketd tx migration claim-supplier \
${MORSE_ADDR_SUPPLIER_3} pocket-account-${MORSE_ADDR_SUPPLIER_3}.json \
${MORSE_SUPPLIER_3_PREFIX}_claim_supplier_3_supplier_config.yaml \
--from=${MORSE_SUPPLIER_3_PREFIX}-claim-supplier-3 \
--network=local \
--home=./localnet/pocketd --keyring-backend=test --no-passphrase \
--gas=auto --gas-adjustment=1.5 --yes
Verify supplier exists onchain:
pocketd query supplier show-supplier $SHANNON_ADDR_SUPPLIER_3 -o json --network=local --home=./localnet/pocketd
Check stake after claim:
pocketd query supplier show-supplier $SHANNON_ADDR_SUPPLIER_3 -o json --network=local --home=./localnet/pocketd | jq '.supplier.stake.amount'
Check unstaked balance after claim:
pocketd query bank balance $SHANNON_ADDR_SUPPLIER_3 upokt -o json --network=local --home=./localnet/pocketd | jq '.balance.amount'