# Migration checklist ## Preparation of the Migration - [x] Shell recovery runtime spec, wasm and head created - [x] Contains `system` pallets for operation as parachain - [x] Contains `sudo` pallet - [x] Contains `XCM` pallets - [x] Live parachain (migrate from) runtime created - [x] Contains `system` pallets for - [x] Contains `XCM` pallets - [x] Contains `utility` pallet - [x] Increased `RuntimeVersion` - [x] `type CheckAssociatedRelayNumber = cumulus_pallet_parachain_system::AnyRelayNumber;` - [x] Use a proper NetworkId in XCM configuration. - [x] `system.kill_storage` is not call-filtered - [x] `system.set_storage` is not call-filtered - [x] Consider any hooks that have an increased computational demand - [x] Apply a call-filter to filter token transfers. - [x] `balances` pallet - [x] `currencies` pallet - [x] `tokens` pallet - [x] Apply a call-filter to business logic - [x] `prediction-markets` pallet - [x] `parachain-staking` pallet - [x] `swaps` pallet - [x] `styx` pallet - [x] Shell recovery runtime spec, wasm and head created - [x] Contains `system` pallets for operation as parachain - [x] Contains `sudo` pallet - [x] Contains `solo-to-para` pallet ~~- [ ] Reserved recovery parachain parachain id~~ ~~- [ ] Registered recovery wasm and head for recovery parachain~~ - [x] Verified whole procedure by multiple people in a close-to-production environment. Sign here: - Chris (signed) - Harald - Malte - [x] Informed all node operators what they have to do - [x] Informed partners (RPC, Subscan, Subsquare) what they have to do - [x] Informed exchanges at which time deposit and withdrawal will be paused for which duration - [x] Informed all other users what they have to do (get in comfortable state before filter) - [x] Checked that the governance proposal includes proper calls to: - [x] Unlocks the manger account - [x] Deploy the minimal runtime - [x] Batch-All 15 minutes after deployment: - [x] resets `MqcHeads` ~~- [ ] swaps slot leases with recovery parachain~~ - [x] Sets the `parachain_id` to the one used on Polkadot - [x] Reset slot in author-inherent - [x] Updated polkadot.js/apps - [x] Battery Station: https://github.com/polkadot-js/apps/pull/9087 - [x] Zeitgeist: https://github.com/polkadot-js/apps/pull/9086 ## Executing the Migration (Rococo) - [x] Fund parachain sovereign account on live parachain - [x] Fund parachain sovereign account for shell parachain - [x] Unlock shell parachain - [x] Verify that shell parachain is unlocked: `registrar.paras(2101).locked == false` - [x] Upgrade shell parachain with rococo-runtime: `0x0158e6f05d22befab8e595af52d9703fe9b9b309d91768e04759777c52ebd790` - [x] `parachainSystem.authorizeUpgrade` - [x] `parachainSystem.enactAuthorizedUpgrade` - [x] Unlock live parachain - [x] Verify live parachain is unlocked: `registrar.paras(2050).locked == false` - [x] Upgrade live parachain to adjusted runtime: `0xc427dc75023956ad839ce15595bfba85de20c86c979106a29eaf606d3c48d5f7` - [x] `parachainSystem.authorizeUpgrade` - [x] `parachainSystem.enactAuthorizedUpgrade` - [x] Wait 10min and then check that both `spec_version` have changed - [x] Execute chain-halting call: `0x1f020c000504800d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f10350800000005088045323df7cc47150b3930e2666b0aa3133dca42deb008c6559ee789c9b9f70a2c250108ee07000000000000000000000000000000000000000000000000000000000000000000002a08000044c3832b01d79e9a4deb8d79f2ffec9936a9eb4895e29faeda3ce674cb9a502c8045323df7cc47150b3930e2666b0aa313911a5dd3f1155f5b7d0c5aa102a757f9805bd38c0b4f2826b506a9a89440dc067ef579651ee4dc33348e9a54adacbb985c00060480ab2a8d5eca218f218c6fda6b1d22bb926bc171ab77f6a731a6e80c34ee1eda19` - Change the parachain id from 2050 to 2101 - Change MQC heads to those of the shell chain - Reset `AuthorInherent::HighestSlotSeen` - [x] Ensure that the parachain has halted - [x] Inform the node operators that the chain has successfully halted - [x] Read head from live parachain: `paras.heads(2050)`: `0x3986d82fc2e485f169a43bab5ca6e7715c2e187ac376485b7030c8310c6d38e39222ba00798820be7292869f1d273d86df86c95b7bb141e77bf363db64d836168455f9820b1bc6caa6e0850ac9769573beda46e0c286579126ce16358e820485967b178608066e6d62738058c5d7f5b01cfe6c94a5f540088313af0aa08eda11a47e4d7ebfaf4cd2983356056e6d62730101fc082b01efe9575fb61336086e9aae4c9dbd0bb2c41f1e971f5d60d8d429940c55b36112d891b48fc99148cdfbf6c02d20917d10a2c1cde7b89550efa827c285` - [x] Execute `solo_to_para.migrate(runtime, head)` - [x] Inform node operators to swap relaychain data and restart their nodes with the new chain spec - [x] Replace Kusama relaychain data with Rococo relaychain data (during the upgrading "migrate") - [x] Wait until the update has gone through - [x] Verify that the chain produces blocks (via the relaychain) - [x] Wait until cooldown on relaychain Rococo (~1 hour) - [x] Upgrade from the migration runtime to production runtime - [x] Lock live parachain - [x] Lock shell parachain ## Executing the Migration (Polkadot) - [x] Fund parachain sovereign account on live parachain: `0x7061726135080000000000000000000000000000000000000000000000000000` - [x] Fund parachain sovereign account for shell parachain: `0x706172612c080000000000000000000000000000000000000000000000000000` - [x] Unlock shell parachain: `0x96007a0001010002100004000000000700e40b540213000000000700e40b5402010700bca06501060003009435771846042c0800000d01000400010100706172612c080000000000000000000000000000000000000000000000000000` - [x] Verify that shell parachain is unlocked: `registrar.paras(2092).locked == false` - [x] Upgrade shell parachain with polkadot-runtime (`solo-to-para` + `utility`; `0xa4dff4eeeae96057af5d5723f0d861970716d5d0a0f85abd037e9df5a782f6b8`) - [x] `parachainSystem.authorizeUpgrade` - [x] `parachainSystem.enactAuthorizedUpgrade` - [x] Unlock live parachain: `0x7a0001010002100004000000000700e876481713000000000700e8764817010700bca0650106000300943577184604350800000d0100040001010075377ef2134ba01437aedca468f8277177c5bd3f691e08af8099cd807edef81a` - [x] Verify live parachain is unlocked: `registrar.paras(2101).locked == false` - [x] Upgrade live parachain to adjusted runtime: `0xef115d61db247aab97924ff316b9abc95d831c8b53313556ab1490e4dfbdfaf2` - [x] `parachainSystem.authorizeUpgrade` - [x] `parachainSystem.enactAuthorizedUpgrade` - [x] Wait 1 hour and then check that both `spec_version` have changed - [X] Execute chain-halting call: `0x1f020c000504800d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f102c0800000006088045323df7cc47150b3930e2666b0aa313911a5dd3f1155f5b7d0c5aa102a757f98045323df7cc47150b3930e2666b0aa3133dca42deb008c6559ee789c9b9f70a2c00060480ab2a8d5eca218f218c6fda6b1d22bb926bc171ab77f6a731a6e80c34ee1eda19` - Change the parachain id from 2101 to 2092 - Kill the MQC heads - Reset `AuthorInherent::HighestSlotSeen` - [x] Ensure that the parachain has halted - [x] Inform node operators to swap relaychain data and restart their nodes with the new chain spec - [x] Read head from live parachain: `paras.heads(2101)`: `0xc1a05ab112f2018eee0974d7d568cca48121977cac12988e3314ba6567a0eb86a28c9900da484331e47d03b8012cd6479f4a98c6b977a69784298fb7d316b8b646f18d2747c3cabaa5ac11bb68dcdb3cc26edb1d776a888a5a6ac93afc1d6f1637db148008066e6d6273802e9870ecb3b779e4ba2658e5208f51fb126e0a103b82df3004b5f0a58e11457f056e6d6273010186c049d412ab27b11a923b52c12cc468058fe71304d9fc1578c39b922f6277469aca1569de7e36de14949ac11383e6f85d0330bfccce91aa32eac4413607e38e` - [x] Execute `solo_to_para.migrate(runtime, head)` - [x] Wait until the update has gone through - [x] Verify that the chain produces blocks - [x] Wait until cooldown on relaychain Polkadot (~24h) - [x] Upgrade from the migration runtime to production runtime (polkadot-runtime) ~~- [ ] Lock live parachain~~ (postponed since the purpose of the former live parachain has not been determined yet) - [ ] Lock shell parachain ## Recovery - [ ] Save block hash of last valid block (before halt) - [ ] Generate Chainspec with bad_blocks and put in last valid block - [ ] Sync the livechain exluding bad_blocks - at least one bootnode should maintain the data of halted chain - [ ] Change protocol id of previous chainspec - [ ] Replace the previous chainspec with the new one and start node - [ ] Distribute new chainspec to all node operators (to sync) - [ ] Get latest head with [ExportHeader](https://github.com/zeitgeistpm/zeitgeist/blob/1f7ea6192eb9ad5921a99ad959e14d9065d8ca09/node/src/command.rs#L283-L298) of last valid block (before bad_blocks) - [ ] Use manager to `registrar.set_current_head` on Kusama Relaychain to - [ ] Maybe cancel any scheduled calls (which part of migration) - [ ] lock parachain `registrar.add_lock`