What to review next: #31378
Here is a proposed timeline for the move from legacy wallets to descriptor wallets, and at the same time, bdb to sqlite, culminating with the removal of both legacy wallets and bdb. Even though the wallet type and the wallet storage format are orthogonal to each other, as noted in #19077, I would like to tie them together for the sake of simplicity when it comes to how we make new wallets and the migration of one type to another.
The 4 combinations of type and format are: legacy-bdb, legacy-sqlite, descriptor-bdb, and descriptor-sqlite. While all 4 types will be supported, we will primarily deal with legacy-bdb and descriptor-sqlite. Setting descriptors=True in createwallet (or checking the Descriptors option in the GUI) will always make a descriptor-sqlite. Setting that to False will always make a legacy-bdb.
-  0.21 (late 2020)
- Initial release of descriptor type and sqlite format. (#16528, #19077)
- Descriptor type is experimental with a warning as such (#16528)
- Only legacy-bdb and descriptor-sqlite will be created (#19077)
 
-  22.0 (mid 2021)
- Implement descriptor exports (#20226)
- Legacy type remains default (no pr needed)
-  Introduce dumpandcreatefromdumpwallet tool commands with an additional-formatoption to specify the wallet type (#19137)- Users may use dumpand thencreatefromdumpin order to make legacy-sqlite from legacy-bdb
- Users may use dumpand thencreatefromdumpin order to make descriptor-bdb from descriptor-sqlite
 
- Users may use 
- If a wallet specified in conf or command line doesn’t exist, don’t make a wallet and instead warn (#15454)
 
-  23.0 (early 2022)
- Change descriptor type to non-experimental (#23002)
-  Change createwalletdescriptorsdefault toTrue(#23002)
-  Change wallet tool create-descriptorsdefault toTrue(#23002)
 
-  24.0 (late 2022)
-  Introduce migratewalletcommand to migrate a legacy-bdb to descriptor-sqlite (#19602)
- For newly created legacy-bdb wallets, warn that they are deprecated and will soon be unsupported (#24505)
 
-  Introduce 
- 26.0 (late 2023)
-  27.0 (early 2024)
- address book performance improvement #26836
- bulk deletion of txs performance improvement #28987
- bulk deletion of records performance improvement #29403
- Caching to improve performance of migrated non-HD descriptor wallets (also perf improvement in general) #26008
-  Remove migratewalletexperimental warning #28037
 
-  28.0 (late 2024)
- Improve performance of migratewallet #28574
-  Reimplement legacy-bdb to descriptor-sqlite migration (maybe as a separate command or in the wallet tool) to be independent of LegacyScriptPubKeyManand BDB (#26596)
-  For dump, implement an independent BDB file loader (this should probably be shared with the previous) (#26606)
- GUI: Migrate wallets that are not loaded (https://github.com/bitcoin-core/gui/pull/824)
- Fix default wallet migration naming (#29586)
-  Fix listwalletdirof migrated default wallets and generated backups (#30265)
 
-  29.0 (early 2025)
- Watch-only wallet migration edge case (#31374)
- Avoid weird script corner cases (#31495)
- Rework wallet_migration.py (#31248)
- Add combinerawtransaction test that doesn’t need legacy wallet (#31249)
- Remove legacy wallet from migration benchmark (#31241)
 
-  30.0 (late 2025)
- Remove optional sqlite when building with wallet (#31961)
- Invalid multisigs migration edge case (#31378)
- Stop loading legacy-bdb, descriptor-bdb, legacy-sqlite wallet entirely. Inform users how to migrate (#31250)
-  Remove LegacyScriptPubKeyManexcept for the independent migration stuff (#28710)
- Remove BDB except for independent loading for migration stuff (#28710)
 
Additional improvements that have no target deadline:
- Backwards compatibility tests fixes for descriptor wallets #28027
The migration code will probably be around for a long time/forever.
Note that we expect users who go through the effort to make a legacy-sqlite or descriptor-bdb wallet to suck it up and deal with the consequences of doing something that isn’t really supported. Such users should be able to figure out for themselves how to migrate their wallets. (Maybe migratewallet can migrate legacy-sqlite to descriptor-sqlite. bdb to sqlite is way easier than legacy to descriptor).
