name: snowbridge-referendum
description: Generate a Snowbridge preimage, create opengov referendum calls, test with referenda-tester (including XCM verification on BridgeHub), and report results
disable-model-invocation: true
allowed-tools: Bash, Read, Write, Grep, Glob
argument-hint: [--track
Snowbridge Referendum Workflow
End-to-end workflow: generate a Snowbridge governance preimage, create opengov referendum calls with opengov-cli, test them with the referenda-tester (including XCM relay verification on BridgeHub), and report results ready for on-chain submission.
Arguments
$0: The snowbridge-preimage subcommand (e.g.mint-feb2026,upgrade-v2,pricing-parameters, etc.)- Remaining args (
$ARGUMENTS): May include--trackand--networkoverrides.--track:whitelisted-caller(default) orroot--network:polkadot(default),kusama,westend,paseo
Project Locations
- Snowbridge preimage tool:
./preimage/(relative to this control directory) - opengov-cli:
../../opengov-cli/(relative to this control directory)
Steps
1. Generate the preimage
Run the snowbridge preimage tool:
cd <snowbridge-control-dir>/preimage && cargo run --features <network> -- <subcommand> [extra-flags]
- The
--featuresflag must match the network:polkadot,kusama,westend, orpaseo. - Capture the hex output (the line starting with
0x) from stdout. - Capture the preimage hash and size from stderr (lines like
Preimage hash: 0x...andPreimage size: N). - Save the hex to
preimage.txtin the opengov-cli project root.
2. Run opengov-cli
From the opengov-cli directory:
cargo run -- submit-referendum --proposal preimage.txt --network <network> --track <track> --output calldata
Parse the output to extract these hex values:
- Fellowship referendum call: line after "Open a Fellowship referendum to whitelist the call:" (only for whitelisted-caller track)
- Governance batch call: line after "Batch to submit on Polkadot Asset Hub:" (or the relevant chain)
- Collectives batch call: line after "Batch to submit on Polkadot Collectives Chain:" (only for whitelisted-caller track)
For --track root, there is no fellowship call or collectives batch.
3. Test with referenda-tester
This is the critical verification step. The referenda-tester simulates the full governance flow using Chopsticks.
Determine additional chains
If the preimage sends XCM to other chains (e.g. BridgeHub), add them via --additional-chains. This is essential for verifying the XCM roundtrip completes successfully.
Common patterns:
- Preimage contains
PolkadotXcm::sendto BridgeHub (e.g. mint, replay, upgrade commands): add BridgeHub - Preimage is AH-local only (e.g. treasury spend, register asset): no additional chains needed
To determine this: check if the preimage tool's subcommand uses send_xcm_bridge_hub() in commands.rs. If so, BridgeHub is needed.
Whitelisted-caller track (default)
npx github:karolk91/polkadot-referenda-tester test \
--governance-chain-url wss://asset-hub-polkadot-rpc.n.dwellir.com \
--fellowship-chain-url wss://polkadot-collectives-rpc.polkadot.io \
--call-to-create-governance-referendum '<governance-batch-hex>' \
--call-to-create-fellowship-referendum '<collectives-batch-hex>' \
--additional-chains wss://bridge-hub-polkadot-rpc.n.dwellir.com \
--verbose
Root track
npx github:karolk91/polkadot-referenda-tester test \
--governance-chain-url wss://asset-hub-polkadot-rpc.n.dwellir.com \
--call-to-create-governance-referendum '<governance-batch-hex>' \
--additional-chains wss://bridge-hub-polkadot-rpc.n.dwellir.com \
--verbose
Omit --fellowship-chain-url and --call-to-create-fellowship-referendum for root track.
Omit --additional-chains if the preimage doesn't send XCM to other chains.
Testnet URLs
| Network | Asset Hub | Collectives | BridgeHub |
|---|---|---|---|
| Polkadot | wss://asset-hub-polkadot-rpc.n.dwellir.com |
wss://polkadot-collectives-rpc.polkadot.io |
wss://bridge-hub-polkadot-rpc.n.dwellir.com |
| Kusama | wss://asset-hub-kusama-rpc.n.dwellir.com |
wss://kusama-collectives-rpc.n.dwellir.com |
wss://bridge-hub-kusama-rpc.n.dwellir.com |
| Westend | wss://asset-hub-westend-rpc.n.dwellir.com |
wss://westend-collectives-rpc.n.dwellir.com |
wss://bridge-hub-westend-rpc.n.dwellir.com |
4. Verify the referenda-tester output
Check the output for these success indicators:
Governance dispatch
Both referenda executed successfully!(or single referendum for root track)Scheduler.Dispatchedwithresult: successWhitelist.WhitelistedCallDispatchedwithresult: success(whitelisted-caller track)
XCM to BridgeHub (if applicable)
PolkadotXcm.Sentwith destinationParachain: 1002(BridgeHub)XcmpQueue.XcmpMessageSenton Asset Hub- Outbound HRMP message to recipient
1002in the Chopsticks logs
BridgeHub processing (if additional chain added)
MessageQueue.Processedwithorigin: Sibling(1000)andsuccess: truePolkadotXcm.Sentfrom BridgeHub back to AH (destinationParachain: 1000)XcmpQueue.XcmpMessageSenton BridgeHub- Outbound HRMP message to recipient
1000in the Chopsticks logs
For commands that mint/deposit assets (e.g. mint-feb2026, replay-sep2025), verify the return XCM contains:
ReserveAssetDepositedwith the correct asset and amountDepositAssetwith the correct beneficiary- The asset location should be the expected foreign asset (e.g. Ethereum ERC20)
Failure investigation
If the test fails:
- Check
Scheduler.Dispatchedresult for errors - Look for
XcmpQueue.FailorMessageQueue.ProcessingFailedevents - Check BridgeHub events for
Transactfailures - Inspect the Chopsticks
outboundHrmpMessagelogs to see if XCM was sent
5. Report results
Print a summary including:
- Preimage hash and size
- Whether all referenda passed
- Whether XCM roundtrip completed (if applicable)
- The final call data for posting:
- Governance batch (submit on Asset Hub)
- Collectives batch (submit on Collectives, whitelisted-caller only)
- Any issues found during testing
If everything passes, the calls are ready for on-chain submission.