{
 "number": 25722,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/25722",
 "title": "refactor: Use util::Result class for wallet loading",
 "author": "ryanofsky",
 "author_association": "MEMBER",
 "created_at": "2022-07-27T19:26:58Z",
 "updated_at": "2026-09-09T09:24:53Z",
 "age_days": 1512,
 "draft": true,
 "labels": [
  "Refactoring",
  "Needs rebase"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "e1f22bfc9c7d95ab87740a6d7b060f41347f9532",
 "head_ref": "pr/bresult-load",
 "head_repo": "ryanofsky/bitcoin",
 "head_history": [
  {
   "t": "2022-08-05T19:00:38Z",
   "sha": "a09c21c05a9adf0ca5a4b6a15021b45c6c2e0b2a"
  },
  {
   "t": "2022-08-15T18:18:04Z",
   "sha": "e7457d0acefeccd636c134d0c10567ffaade2fc7"
  },
  {
   "t": "2022-09-01T15:41:54Z",
   "sha": "874003fcea81aba1276b53d5ad9c5dadefddd5ff"
  },
  {
   "t": "2022-09-01T21:04:39Z",
   "sha": "d020d0cce052bc7b4141347a51d34fd85f8a10a1"
  },
  {
   "t": "2022-09-02T18:09:35Z",
   "sha": "f942d9253e39df6fedf7f3fe4b0bdb2921206de0"
  },
  {
   "t": "2022-09-14T19:54:23Z",
   "sha": "4e533926fe5549aafb70caf94718447ea497c84c"
  },
  {
   "t": "2022-09-15T15:45:23Z",
   "sha": "f3d165866329ec16e39a7289bd9769ad209cd56a"
  },
  {
   "t": "2022-09-20T17:14:21Z",
   "sha": "f718aec8db4d92037cf21bde2f92c72ed39c1d09"
  },
  {
   "t": "2022-10-14T21:42:58Z",
   "sha": "7bd578a5caf91f73ee9127cd621e2838d5a3b427"
  },
  {
   "t": "2023-01-20T21:44:42Z",
   "sha": "2c675f03f017125390f3b578ee6169870deae985"
  },
  {
   "t": "2023-02-11T00:00:00Z",
   "sha": "2e12b25fae4bca7539c3cf7ccb9e12e03c9e517d"
  },
  {
   "t": "2023-03-01T18:17:49Z",
   "sha": "5c1be5339b05f5923b8843fe3caa183044454608"
  },
  {
   "t": "2023-04-07T00:23:18Z",
   "sha": "9c2817208cd5e0a521e765b43d71bb78afc5a7f9"
  },
  {
   "t": "2023-04-13T01:32:02Z",
   "sha": "2a9db070ec5acfe6843e44e1f8476f86899a8e29"
  },
  {
   "t": "2023-05-03T18:13:04Z",
   "sha": "f7d4451b98014176c083adc02bdf59e6dd2b9355"
  },
  {
   "t": "2023-07-21T16:54:42Z",
   "sha": "17891a95ab5873aa978a5bf5ed8985ee1513e728"
  },
  {
   "t": "2023-08-02T12:08:00Z",
   "sha": "1a540b591c742594cca285ef9b8b16c6d8507d58"
  },
  {
   "t": "2023-09-25T18:08:12Z",
   "sha": "1b2a5f12b42543d13a4bcafb9585e3d1df488914"
  },
  {
   "t": "2024-02-21T23:36:39Z",
   "sha": "6700299bcb6f560e9e4caf34254d7d86d4e78833"
  },
  {
   "t": "2024-02-22T20:00:08Z",
   "sha": "2385cb37dbbe00004f8bffe1d1d784778d89a21e"
  },
  {
   "t": "2024-05-01T17:57:39Z",
   "sha": "987b28bbc991868ed305dbfc8f0846dd8b0b893c"
  },
  {
   "t": "2024-05-02T16:40:28Z",
   "sha": "548bf508e26aae39c732b3e61861d5c29669df06"
  },
  {
   "t": "2024-05-02T22:02:03Z",
   "sha": "ae0b9b8fcece154bae7f4383990e9d10f6cc0d2b"
  },
  {
   "t": "2024-05-03T15:15:10Z",
   "sha": "5beaefaa806e54327d5995d86fd2d56d4687d575"
  },
  {
   "t": "2024-06-17T23:08:14Z",
   "sha": "e5e29399ddf6af0520c1e0f5949383d597c9a09d"
  },
  {
   "t": "2024-06-18T15:04:41Z",
   "sha": "c39b4ab6c592decc5a79c14d4ac8bafa7693f647"
  },
  {
   "t": "2024-06-20T12:33:09Z",
   "sha": "089c58f5b0fa26aa8eeb2889ead48590f16398bb"
  },
  {
   "t": "2024-07-18T19:24:12Z",
   "sha": "f8c5f3d640d96a335c0c36966dbb6a9332647449"
  },
  {
   "t": "2024-07-19T13:17:40Z",
   "sha": "2b0e70295ed6ff4be91cc5775ddaa9351a1ed430"
  },
  {
   "t": "2024-11-04T13:36:15Z",
   "sha": "caed6aec4241a2e5d849c9446725c889348e1b7e"
  },
  {
   "t": "2024-11-04T15:54:53Z",
   "sha": "830570fe684e05c170def209633c682363d3b830"
  },
  {
   "t": "2024-12-06T12:18:23Z",
   "sha": "e2376f9847c8cd07bb5f2c82f8b0055a72086b66"
  },
  {
   "t": "2025-03-12T02:23:42Z",
   "sha": "0284396a4229025a6201d7486484b17c00f3eb8c"
  },
  {
   "t": "2025-03-20T17:59:16Z",
   "sha": "88dfdac4bc23c87f79c55ed6b2c255f29137768e"
  },
  {
   "t": "2025-08-01T23:15:29Z",
   "sha": "96f66136f02833f00520eb18e32d0a2848cb4c2a"
  },
  {
   "t": "2025-10-15T00:42:04Z",
   "sha": "fdff2b4550e8b2b64e25d413298283fa1b516088"
  },
  {
   "t": "2025-11-11T22:15:29Z",
   "sha": "46d01725ed1434fba8d974f57f6893e2cd1facee"
  },
  {
   "t": "2025-11-12T16:06:24Z",
   "sha": "2dc6d076e76f9c778dbced9adfd0ef64aea732b1"
  },
  {
   "t": "2025-12-12T12:19:24Z",
   "sha": "d3e677f59d6369dc295edb7b5f112b83f99ec3c9"
  },
  {
   "t": "2025-12-16T02:10:39Z",
   "sha": "2c7996d7c398b0927008a1903aad786d81c3e949"
  },
  {
   "t": "2026-01-17T22:24:46Z",
   "sha": "aa17527d48cb5428558988603ac68b66f2dc06b8"
  },
  {
   "t": "2026-01-18T00:58:09Z",
   "sha": "c8c80f9198bd8b8882eb8526e4f093205be68ec8"
  },
  {
   "t": "2026-01-22T21:45:22Z",
   "sha": "7a897eb8a449b1de63feaae4cf493950c8199240"
  }
 ],
 "additions": 1397,
 "deletions": 773,
 "changed_files": 44,
 "commit_count": 25,
 "size_bucket": "XL",
 "mergeable_state": "dirty",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {},
   "conflicts": [
    {
     "number": 36052,
     "title": "ci: Doc: Move all config comments right next to the option they explain",
     "author": "maflcko"
    },
    {
     "number": 36042,
     "title": "build: Bump g++ minimum supported version to 13",
     "author": "maflcko"
    },
    {
     "number": 36033,
     "title": "[wip,nomerge,rfc] build: Require C++23 compiler",
     "author": "maflcko"
    },
    {
     "number": 36030,
     "title": "util: move function calls outside standard assertions",
     "author": "l0rinc"
    },
    {
     "number": 36006,
     "title": "ci: add Guix builds to CI",
     "author": "willcl-ark"
    },
    {
     "number": 35833,
     "title": "rpc,wallet: prevent user input injecting fake log lines",
     "author": "l0rinc"
    },
    {
     "number": 35829,
     "title": "http: Make class fields private and make HTTPResponse a struct",
     "author": "hodlinator"
    },
    {
     "number": 35820,
     "title": "refactor: keep duration calculations typed",
     "author": "l0rinc"
    },
    {
     "number": 35768,
     "title": "wallet: Reject whitespace-only wallet names",
     "author": "vicjuma"
    },
    {
     "number": 35760,
     "title": "wallet: make corrupted transaction records fail wallet loading instead of forcing a rescan",
     "author": "achow101"
    },
    {
     "number": 35752,
     "title": "wallet: make encryption state updates atomic",
     "author": "l0rinc"
    },
    {
     "number": 35713,
     "title": "Remove boost as a unit test runner",
     "author": "rustaceanrob"
    },
    {
     "number": 35557,
     "title": "kernel, validation: Add btck_chainstate_manager_set_clock_time",
     "author": "ryanofsky"
    },
    {
     "number": 35492,
     "title": "wallet: fail dump on incomplete writes",
     "author": "OSINTv96"
    },
    {
     "number": 35445,
     "title": "wallet, descriptor: Revert `StringType::COMPAT` for Miniscript expressions and drop the concept of a Descriptor ID that can be validated",
     "author": "achow101"
    },
    {
     "number": 35436,
     "title": "wallet: Add addHDkey interface",
     "author": "pseudoramdom"
    },
    {
     "number": 35187,
     "title": "kernel: Block validation without a complete UTXO set",
     "author": "sedited"
    },
    {
     "number": 34132,
     "title": "coins,dbwrapper: remove error catcher, make point-read failures fatal",
     "author": "l0rinc"
    },
    {
     "number": 33112,
     "title": "wallet: relax external_signer flag constraints, add musig2 test (partial)",
     "author": "Sjors"
    },
    {
     "number": 33033,
     "title": "wallet, sqlite: Encapsulate SQLite statements in a RAII class",
     "author": "achow101"
    },
    {
     "number": 32895,
     "title": "wallet: Prepare for future upgrades by recording versions of last client to open and decrypt",
     "author": "achow101"
    },
    {
     "number": 31260,
     "title": "scripted-diff: Type-safe settings retrieval",
     "author": "ryanofsky"
    },
    {
     "number": 30342,
     "title": "kernel, logging: Pass Logger instances to kernel objects",
     "author": "ryanofsky"
    },
    {
     "number": 29700,
     "title": "kernel, refactor: return error status on all fatal errors",
     "author": "ryanofsky"
    },
    {
     "number": 29278,
     "title": "Wallet:  Add `maxfeerate` wallet startup option",
     "author": "ismaelsadeeq"
    },
    {
     "number": 27865,
     "title": "wallet: Track no-longer-spendable TXOs separately",
     "author": "achow101"
    },
    {
     "number": 10102,
     "title": "Multiprocess bitcoin",
     "author": "ryanofsky"
    }
   ]
  }
 },
 "acks_parsed": {},
 "acks_tally": {
  "ack": 0,
  "stale_ack": 0,
  "concept_ack": 0,
  "approach_ack": 0,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 0,
  "changes_requested": 1,
  "distinct_reviewers": [
   "maflcko",
   "martinus",
   "sedited"
  ]
 },
 "signals": {
  "needs_rebase": true,
  "ci_failed": false,
  "mergeable_state": "dirty",
  "last_author_activity": "2026-09-08T08:13:51Z",
  "last_reviewer_activity": "2023-08-01T14:55:26Z",
  "last_reviewer": "maflcko",
  "author_silent_days": 9,
  "waiting_on_author_days": 0,
  "days_since_update": 8
 },
 "refs": {
  "mentioned": [
   19602,
   24845,
   25504,
   25616,
   25665,
   25666,
   25667,
   26004,
   26005,
   26021,
   26022,
   26032,
   26198,
   26238,
   26282,
   26462,
   26594,
   26595,
   26618,
   26758,
   27279,
   28333,
   30595,
   31241,
   31451,
   31519,
   31650,
   31961,
   32636,
   34269,
   35182,
   35266,
   35655,
   35914,
   35955,
   36127
  ],
  "depends_on": [
   25665
  ],
  "fixes": [],
  "linked_issues": [],
  "references": [
   {
    "number": 25665,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "refactor: Add util::Result failure types and ability to merge result values"
   },
   {
    "number": 26022,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "Add util::ResultPtr class"
   },
   {
    "number": 26004,
    "type": "issue",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "util::Result has confusing interface for std::*_ptr T"
   },
   {
    "number": 19602,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2022-09-01",
    "title": "wallet: Migrate legacy wallets to descriptor wallets"
   },
   {
    "number": 24845,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2023-03-23",
    "title": "wallet: return error msg for  \\\"too-long-mempool-chain\\\""
   },
   {
    "number": 25504,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2022-08-16",
    "title": "RPC: allow to track coins by parent descriptors"
   },
   {
    "number": 25616,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2022-08-10",
    "title": "refactor: Return `util::Result` from WalletLoader methods"
   },
   {
    "number": 25666,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2023-03-19",
    "title": "refactor: wallet, do not translate init options names"
   },
   {
    "number": 25667,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2022-10-13",
    "title": "assumeutxo: snapshot initialization"
   },
   {
    "number": 26005,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2022-09-19",
    "title": "Wallet: Fix error handling (copy_file failure in RestoreWallet, and in general via interfaces)"
   },
   {
    "number": 26021,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2022-09-13",
    "title": "wallet: bugfix, load a wallet with an unknown/corrupt descriptor causes a fatal error"
   },
   {
    "number": 26032,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2023-02-27",
    "title": "wallet: skip R-value signature grinding for external signers"
   },
   {
    "number": 26198,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2022-10-03",
    "title": "refactor: move Boost Datetime usage to wallet"
   },
   {
    "number": 26238,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2022-12-06",
    "title": "clang-tidy: fixup named argument comments"
   },
   {
    "number": 26282,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2022-10-10",
    "title": "wallet: have prune error take precedence over assumedvalid"
   },
   {
    "number": 26462,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2022-12-05",
    "title": "wallet: fix crash on loading descriptor wallet containing legacy key type entries"
   },
   {
    "number": 26594,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2022-12-01",
    "title": "wallet: Avoid a segfault in migratewallet failure cleanup"
   },
   {
    "number": 26595,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2023-02-22",
    "title": "wallet: be able to specify a wallet name and passphrase to migratewallet"
   },
   {
    "number": 26618,
    "type": "pull",
    "state": "closed",
    "merged": false,
    "merged_at": null,
    "title": "rpc: Prevent unloading a wallet when rescanning"
   },
   {
    "number": 26758,
    "type": "pull",
    "state": "closed",
    "merged": false,
    "merged_at": null,
    "title": "refactor: Add `performance-no-automatic-move` clang-tidy check"
   },
   {
    "number": 27279,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2023-04-12",
    "title": "Add \\\"warnings\\\", deprecate \\\"warning\\\" in {create,load,unload,restore}wallet"
   },
   {
    "number": 28333,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-05-28",
    "title": "wallet: Construct ScriptPubKeyMans with all data rather than loaded progressively"
   },
   {
    "number": 30595,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2025-11-04",
    "title": "kernel: Introduce C header API"
   },
   {
    "number": 31241,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2025-01-24",
    "title": "wallet: remove BDB dependency from wallet migration benchmark"
   },
   {
    "number": 31451,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2025-01-09",
    "title": "wallet: migration, avoid loading legacy wallet after failure when BDB isn't compiled"
   },
   {
    "number": 31519,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2025-03-20",
    "title": "refactor: Use std::span over Span"
   },
   {
    "number": 31650,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-01-19",
    "title": "refactor: Avoid copies by using const references or by move-construction"
   },
   {
    "number": 31961,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2025-03-14",
    "title": "Require sqlite when building the wallet"
   },
   {
    "number": 32636,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-02-04",
    "title": "Split `CWallet::Create()` into `CreateNew` and `LoadExisting`"
   },
   {
    "number": 34269,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-01-21",
    "title": "wallet: disallow creating new or restoring to an unnamed (default) wallet"
   },
   {
    "number": 35182,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-06-22",
    "title": "Replace libevent with our own HTTP and socket-handling implementation"
   },
   {
    "number": 35266,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-06-24",
    "title": "rpc, wallet: add an option to not load the wallet after migrating"
   },
   {
    "number": 35655,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-07-10",
    "title": "wallet: Use in-memory SQLite for temporary wallet in exportwatchonlywallet"
   },
   {
    "number": 35914,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-08-07",
    "title": "test, fuzz: Remove unused variables"
   },
   {
    "number": 35955,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-08-18",
    "title": "wallet: remove orphaned GetAffectedKeys and LegacyScriptPubKeyMan declarations"
   },
   {
    "number": 36127,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-09-07",
    "title": "wallet: remove unused code"
   }
  ],
  "conflicts": [
   36052,
   36042,
   36033,
   36030,
   36006,
   35833,
   35829,
   35820,
   35768,
   35760,
   35752,
   35713,
   35557,
   35492,
   35445,
   35436,
   35187,
   34132,
   33112,
   33033,
   32895,
   31260,
   30342,
   29700,
   29278,
   27865,
   10102
  ]
 },
 "stack": {
  "shares_commits_with": [
   26022
  ],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [
  "src/test/result_tests.cpp",
  "src/util/result.h",
  "src/wallet/spend.cpp"
 ],
 "body": "**This is based on #25665 + #26022.** The non-base commits are:\n\n- [`8d998440c62` Add temporary ResultExtract helper for porting to util::Result](https://github.com/bitcoin/bitcoin/pull/25722/commits/8d998440c62b6e39c3038009ee05ce020b63b1fc)\n- [`ec7c42ab3d0` refactor: Use util::Result class in wallet/sqlite](https://github.com/bitcoin/bitcoin/pull/25722/commits/ec7c42ab3d0d7c86b7c51912fae3f50f0ced3ed0)\n- [`e38aad68ca9` refactor: Use util::Result class in wallet/migrate](https://github.com/bitcoin/bitcoin/pull/25722/commits/e38aad68ca95113e0b66ffd44e53c253f62ee577)\n- [`4fea959bb76` refactor: Use util::Result class in wallet::MakeDatabase](https://github.com/bitcoin/bitcoin/pull/25722/commits/4fea959bb76f991467170a6d704d0f9faa9925aa)\n- [`3d47aba6342` refactor: Use util::Result class in wallet/dump](https://github.com/bitcoin/bitcoin/pull/25722/commits/3d47aba6342be82f1351e2555d02cc2d5bbfa530)\n- [`a6a0feca6f7` refactor: Use util::Result class in wallet/wallettool](https://github.com/bitcoin/bitcoin/pull/25722/commits/a6a0feca6f757d1a8c8d0110be5e9a3c7891ea13)\n- [`d2ca7d8694c` refactor: Use util::Result class in wallet/wallet](https://github.com/bitcoin/bitcoin/pull/25722/commits/d2ca7d8694cb43ecef72127e7807f063f676cc95)\n- [`76d6541f560` refactor: Use util::Result class in wallet/load](https://github.com/bitcoin/bitcoin/pull/25722/commits/76d6541f56080ed302fadeeaee6102f562bacaee)\n- [`480a59b0ad0` refactor: Use util::Result class in wallet/rpc](https://github.com/bitcoin/bitcoin/pull/25722/commits/480a59b0ad0c763dde43cb3fcd9432becc82fee1)\n- [`dea22903f62` refactor: Use util::Result class in wallet/interfaces](https://github.com/bitcoin/bitcoin/pull/25722/commits/dea22903f624e6b68ab5d712870f038c88d368fd)\n- [`6a56e0c7da9` refactor: Use util::Result class in wallet/test](https://github.com/bitcoin/bitcoin/pull/25722/commits/6a56e0c7da996bfc7dea9f121df516d106d12617)\n- [`4d7a5352df3` Drop temporary ResultExtract helper for porting to util::Result](https://github.com/bitcoin/bitcoin/pull/25722/commits/4d7a5352df3871cf9435c084615b85b2dff05be8)\n- [`109d356f8ff` scripted-diff: replace wallet DatabaseStatus with DatabaseError](https://github.com/bitcoin/bitcoin/pull/25722/commits/109d356f8ffa70218f3965435ab116837f2006eb)\n\n---\n\nWallet loading functions up and down the stack have lots of error and warning parameters, and return error information in different ways. This PR makes them uniformly return `util::Result`, without changing behavior.",
 "commits": [
  {
   "sha": "5dd221497c518dcd3dbb52d7cc79c4a74086e3eb",
   "date": "2026-08-14T20:01:12Z",
   "message": "refactor: Add util::Result failure values\n\nAdd util::Result support for returning more error information. For better error\nhandling, adds the ability to return a value on failure, not just a value on\nsuccess. This is a key missing feature that made the result class not useful\nfor functions like LoadChainstate() which produce different errors that need to\nbe handled differently.\n\nThis change also makes some more minor improvements:\n\n- Smaller type size. On 64-bit platforms, util::Result<int> is 16 bytes, and\n  util::Result<void> is 8 bytes. Previously util::Result<int> and\n  util::Result<void> were 72 bytes.\n\n- More documentation and tests."
  },
  {
   "sha": "a649feba608063e4d06ae555aa387bb6136c2478",
   "date": "2026-08-14T20:01:12Z",
   "message": "wallet: fix clang-tidy warning performance-no-automatic-move\n\nPrevious commit causes the warning to be triggered, but the suboptimal return\nfrom const statement was added earlier in 517e204bacd9d.\n\nWarning was causing CI failure https://cirrus-ci.com/task/6159914970644480"
  },
  {
   "sha": "51932a8005acd3fe71e7a603d3c5da29b207975a",
   "date": "2026-08-14T20:01:12Z",
   "message": "refactor: Add util::Result::Update() method\n\nAdd util::Result Update method to make it possible to change the value of an\nexisting Result object. This will be useful for functions that can return\nmultiple error and warning messages, and want to be able to change the result\nvalue while keeping existing messages."
  },
  {
   "sha": "e9d494ca7e70a3aac4d1ddb3aeb7fb25997d8271",
   "date": "2026-08-14T20:01:12Z",
   "message": "refactor: Use util::Result class in LoadChainstate and VerifyLoadedChainstate"
  },
  {
   "sha": "69f8f77588483c105ca29bcd238c5d1c4ad79891",
   "date": "2026-08-14T20:01:12Z",
   "message": "refactor: Add util::Result multiple error and warning messages\n\nAdd util::Result support for returning warning messages and multiple errors,\nnot just a single error string. This provides a way for functions to report\nerrors and warnings in a standard way, and simplifies interfaces.\n\nThe functionality is unit tested here, and put to use in followup PR\nhttps://github.com/bitcoin/bitcoin/pull/25722"
  },
  {
   "sha": "5a38099ffeafbbbea70f2da1c7f69fdf9140d6cb",
   "date": "2026-08-14T20:01:12Z",
   "message": "test: add static test for util::Result memory usage\n\nSuggested by Martin Leitner-Ankerl <martin.ankerl@gmail.com>\nhttps://github.com/bitcoin/bitcoin/pull/25722#discussion_r1174298529\n\nCo-authored-by: Martin Leitner-Ankerl <martin.ankerl@gmail.com>"
  },
  {
   "sha": "95c744333eb0d5fd8fc2dd7a76569a6c52930e8c",
   "date": "2026-08-14T20:01:12Z",
   "message": "ci: Avoid -Wno-error=maybe-uninitialized false positives\n\nAvoid false positive maybe-uninitialized errors in native_previous_releases\nCI job.\n\nFix was suggested by maflcko in\nhttps://github.com/bitcoin/bitcoin/pull/25665#issuecomment-3457573218\n\nCI errors look like:\nhttps://github.com/bitcoin/bitcoin/actions/runs/25426711469/job/74581986567?pr=25665\n\n/home/admin/actions-runner/_work/_temp/src/wallet/test/util.cpp: In function \u2018wallet::DescriptorScriptPubKeyMan* wallet::CreateDescriptor(CWallet&, const std::string&, bool)\u2019:\n/home/admin/actions-runner/_work/_temp/src/wallet/test/util.cpp:143:10: error: \u2018*(const std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>*)((char*)&spkm + offsetof(util::Result<std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>, void, util::Messages>,util::Result<std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>, void, util::Messages>::<unnamed>.util::detail::SuccessHolder<std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>, void, util::Messages>::<unnamed>)).std::reference_wrapper<wallet::DescriptorScriptPubKeyMan>::_M_data\u2019 may be used uninitialized [-Werror=maybe-uninitialized]\n  143 |     auto spkm = Assert(keystore.AddWalletDescriptor(w_desc, keys,/*label=*/\"\", /*internal=*/false));\n      |          ^~~~\ncc1plus: all warnings being treated as errors"
  },
  {
   "sha": "781faa65b05b50a0c06de77512bf0f4f1bf645b7",
   "date": "2026-09-03T11:32:49Z",
   "message": "Merge branch 'pr/bresult2' into pr/bresult-ptr\n\n# Conflicts:\n#\tsrc/init.cpp"
  },
  {
   "sha": "a44b2336cb3862fd8cca6d8644d449ac1bc4311e",
   "date": "2026-09-03T11:32:49Z",
   "message": "Add util::ResultPtr class\n\nThe util::ResultPtr class is a wrapper for util::Result providing syntax sugar\nto make it less awkward to use with returned pointers. Instead of needing to be\ndeferenced twice with **result or (*result)->member, it only needs to be\ndereferenced once with *result or result->member. Also when it is used in a\nboolean context, instead of evaluating to true when there is no error and the\npointer is null, it evaluates to false so it is straightforward to determine\nwhether the result points to something.\n\nThis PR is only partial a solution to #26004 because while it makes it easier\nto check for null pointer values, it does not make it impossible to return a\nnull pointer value inside a successful result. It would be possible to enforce\nthat successful results always contain non-null pointers by using a not_null\ntype (https://github.com/bitcoin/bitcoin/issues/24423) in combination with\nResultPtr, though."
  },
  {
   "sha": "42daa09f9bc6a9613dd8ba4bf26c6f1f54b305cf",
   "date": "2026-09-03T11:32:49Z",
   "message": "Use ResultPtr<unique_ptr> instead of Result<unique_ptr>"
  },
  {
   "sha": "236bb652662a2ac735992f8356d6ef613e3442c3",
   "date": "2026-09-08T08:13:51Z",
   "message": "Merge branch 'pr/bresult-ptr' into pr/bresult-load"
  },
  {
   "sha": "8d998440c62b6e39c3038009ee05ce020b63b1fc",
   "date": "2026-09-08T08:13:51Z",
   "message": "Add temporary ResultExtract helper for porting to util::Result"
  },
  {
   "sha": "ec7c42ab3d0d7c86b7c51912fae3f50f0ced3ed0",
   "date": "2026-09-08T08:13:51Z",
   "message": "refactor: Use util::Result class in wallet/sqlite"
  },
  {
   "sha": "e38aad68ca95113e0b66ffd44e53c253f62ee577",
   "date": "2026-09-08T08:13:51Z",
   "message": "refactor: Use util::Result class in wallet/migrate"
  },
  {
   "sha": "4fea959bb76f991467170a6d704d0f9faa9925aa",
   "date": "2026-09-08T08:13:51Z",
   "message": "refactor: Use util::Result class in wallet::MakeDatabase"
  },
  {
   "sha": "3d47aba6342be82f1351e2555d02cc2d5bbfa530",
   "date": "2026-09-08T08:13:51Z",
   "message": "refactor: Use util::Result class in wallet/dump"
  },
  {
   "sha": "a6a0feca6f757d1a8c8d0110be5e9a3c7891ea13",
   "date": "2026-09-08T08:13:51Z",
   "message": "refactor: Use util::Result class in wallet/wallettool"
  },
  {
   "sha": "d2ca7d8694cb43ecef72127e7807f063f676cc95",
   "date": "2026-09-08T08:13:51Z",
   "message": "refactor: Use util::Result class in wallet/wallet"
  },
  {
   "sha": "76d6541f56080ed302fadeeaee6102f562bacaee",
   "date": "2026-09-08T08:13:51Z",
   "message": "refactor: Use util::Result class in wallet/load"
  },
  {
   "sha": "480a59b0ad0c763dde43cb3fcd9432becc82fee1",
   "date": "2026-09-08T08:13:51Z",
   "message": "refactor: Use util::Result class in wallet/rpc"
  },
  {
   "sha": "dea22903f624e6b68ab5d712870f038c88d368fd",
   "date": "2026-09-08T08:13:51Z",
   "message": "refactor: Use util::Result class in wallet/interfaces"
  },
  {
   "sha": "6a56e0c7da996bfc7dea9f121df516d106d12617",
   "date": "2026-09-08T08:13:51Z",
   "message": "refactor: Use util::Result class in wallet/test"
  },
  {
   "sha": "4d7a5352df3871cf9435c084615b85b2dff05be8",
   "date": "2026-09-08T08:13:51Z",
   "message": "Drop temporary ResultExtract helper for porting to util::Result"
  },
  {
   "sha": "109d356f8ffa70218f3965435ab116837f2006eb",
   "date": "2026-09-08T08:13:51Z",
   "message": "scripted-diff: replace wallet DatabaseStatus with DatabaseError\n\n-BEGIN VERIFY SCRIPT-\ngit grep -l DatabaseStatus src | xargs sed -i s/DatabaseStatus/DatabaseError/g\nsed -i '/^    SUCCESS,$/d' src/wallet/db.h\n-END VERIFY SCRIPT-"
  },
  {
   "sha": "e1f22bfc9c7d95ab87740a6d7b060f41347f9532",
   "date": "2026-09-08T08:13:51Z",
   "message": "test-each-commit: Increase fetch depth\n\nNeeded due to base PR, can be dropped before merge"
  }
 ],
 "timeline": [
  {
   "t": "2022-08-05T19:00:38Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "a09c21c05a9adf0ca5a4b6a15021b45c6c2e0b2a"
  },
  {
   "t": "2022-08-15T18:18:04Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "e7457d0acefeccd636c134d0c10567ffaade2fc7"
  },
  {
   "t": "2022-08-15T18:19:29Z",
   "kind": "comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "text": "Rebased a09c21c05a9adf0ca5a4b6a15021b45c6c2e0b2a -> e7457d0acefeccd636c134d0c10567ffaade2fc7 ([`pr/bresult-load.2`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.2) -> [`pr/bresult-load.3`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.3), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.2-rebase..pr/bresult-load.3)) due to conflict with #25616\nRebased e7457d0acefeccd636c134d0c10567ffaade2fc7 -> 874003fcea81aba1276b53d5ad9c5dadefddd5ff ([`pr/bresult-load.3`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.3) -> [`pr/bresult-load.4`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.4), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.3-rebase..pr/bresult-load.4)) due to conflict with #25504\nRebased 874003fcea81aba1276b53d5ad9c5dadefddd5ff -> d020d0cce052bc7b4141347a51d34fd85f8a10a1 ([`pr/bresult-load.4`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.4) -> [`pr/bresult-load.5`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.5), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.4-rebase..pr/bresult-load.5)) on top of newer base PR [#25665](https://github.com/bitcoin/bitcoin/pull/25665) tag r/bresult2.18 for derived-to-base conversion bugfix\nRebased d020d0cce052bc7b4141347a51d34fd85f8a10a1 -> f942d9253e39df6fedf7f3fe4b0bdb2921206de0 ([`pr/bresult-load.5`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.5) -> [`pr/bresult-load.6`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.6), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.5-rebase..pr/bresult-load.6)) due to silent conflict with #19602\nRebased f942d9253e39df6fedf7f3fe4b0bdb2921206de0 -> 4e533926fe5549aafb70caf94718447ea497c84c ([`pr/bresult-load.6`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.6) -> [`pr/bresult-load.7`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.7), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.6-rebase..pr/bresult-load.7)) on top of newer version of #25665 (pr/bresult2.21)\nRebased 4e533926fe5549aafb70caf94718447ea497c84c -> f3d165866329ec16e39a7289bd9769ad209cd56a ([`pr/bresult-load.7`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.7) -> [`pr/bresult-load.8`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.8), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.7-rebase..pr/bresult-load.8)) due to conflict with #26021\nRebased f3d165866329ec16e39a7289bd9769ad209cd56a -> f718aec8db4d92037cf21bde2f92c72ed39c1d09 ([`pr/bresult-load.8`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.8) -> [`pr/bresult-load.9`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.9), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.8-rebase..pr/bresult-load.9)) due to conflict with #26005\nRebased f718aec8db4d92037cf21bde2f92c72ed39c1d09 -> 7bd578a5caf91f73ee9127cd621e2838d5a3b427 ([`pr/bresult-load.9`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.9) -> [`pr/bresult-load.10`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.10), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.9-rebase..pr/bresult-load.10)) due to conflicts with #25667, #26198, and #26282\nRebased 7bd578a5caf91f73ee9127cd621e2838d5a3b427 -> 2c675f03f017125390f3b578ee6169870deae985 ([`pr/bresult-load.10`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.10) -> [`pr/bresult-load.11`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.11), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.10-rebase..pr/bresult-load.11)) due to conflicts with #26238, #26462, #26594, #26618, #26758\nRebased 2c675f03f017125390f3b578ee6169870deae985 -> 2e12b25fae4bca7539c3cf7ccb9e12e03c9e517d ([`pr/bresult-load.11`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.11) -> [`pr/bresult-load.12`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.12), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.11-rebase..pr/bresult-load.12)) on top of pr/bresult2.28\nRebased 2e12b25fae4bca7539c3cf7ccb9e12e03c9e517d -> 5c1be5339b05f5923b8843fe3caa183044454608 ([`pr/bresult-load.12`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.12) -> [`pr/bresult-load.13`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.13), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.12-rebase..pr/bresult-load.13)) due to conflicts with #26595 and #26032\nRebased 5c1be5339b05f5923b8843fe3caa183044454608 -> 9c2817208cd5e0a521e765b43d71bb78afc5a7f9 ([`pr/bresult-load.13`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.13) -> [`pr/bresult-load.14`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.14), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.13-rebase..pr/bresult-load.14)) due to conflicts with #25666 and #24845\nRebased 9c2817208cd5e0a521e765b43d71bb78afc5a7f9 -> 2a9db070ec5acfe6843e44e1f8476f86899a8e29 ([`pr/bresult-load.14`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.14) -> [`pr/bresult-load.15`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.15), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.14-rebase..pr/bresult-load.15)) due to conflict with #27279"
  },
  {
   "t": "2022-09-01T15:41:54Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "874003fcea81aba1276b53d5ad9c5dadefddd5ff"
  },
  {
   "t": "2022-09-01T21:04:39Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "d020d0cce052bc7b4141347a51d34fd85f8a10a1"
  },
  {
   "t": "2022-09-02T18:09:35Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "f942d9253e39df6fedf7f3fe4b0bdb2921206de0"
  },
  {
   "t": "2022-09-14T19:54:23Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "4e533926fe5549aafb70caf94718447ea497c84c"
  },
  {
   "t": "2022-09-15T15:45:23Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "f3d165866329ec16e39a7289bd9769ad209cd56a"
  },
  {
   "t": "2022-09-20T17:14:21Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "f718aec8db4d92037cf21bde2f92c72ed39c1d09"
  },
  {
   "t": "2022-10-14T21:42:58Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "7bd578a5caf91f73ee9127cd621e2838d5a3b427"
  },
  {
   "t": "2023-01-20T21:44:42Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "2c675f03f017125390f3b578ee6169870deae985"
  },
  {
   "t": "2023-02-11T00:00:00Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "2e12b25fae4bca7539c3cf7ccb9e12e03c9e517d"
  },
  {
   "t": "2023-03-01T18:17:49Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "5c1be5339b05f5923b8843fe3caa183044454608"
  },
  {
   "t": "2023-04-07T00:23:18Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "9c2817208cd5e0a521e765b43d71bb78afc5a7f9"
  },
  {
   "t": "2023-04-13T01:32:02Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "2a9db070ec5acfe6843e44e1f8476f86899a8e29"
  },
  {
   "t": "2023-04-16T08:04:06Z",
   "kind": "review_comment",
   "who": "martinus",
   "assoc": "CONTRIBUTOR",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": null,
   "text": "Maybe it would be a bit clearer to use `(O&& other)` here?"
  },
  {
   "t": "2023-04-16T08:04:58Z",
   "kind": "review_comment",
   "who": "martinus",
   "assoc": "CONTRIBUTOR",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": null,
   "text": "Same here, I'd say `void MoveConstruct(Result<OT, OF>&& other)` is a bit clearer"
  },
  {
   "t": "2023-04-16T08:06:03Z",
   "kind": "review_comment",
   "who": "martinus",
   "assoc": "CONTRIBUTOR",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": null,
   "text": "Ha, nice trick; I've never seen such an inheritance before :-)"
  },
  {
   "t": "2023-04-16T10:48:44Z",
   "kind": "review_comment",
   "who": "martinus",
   "assoc": "CONTRIBUTOR",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": null,
   "text": "It took me a while to figure out what's going on here with the recursive `Construct` calls and the lambda that's passed along.  How about instead of passing a lambda along use a `bool` template argument like so:\n\n```diff\ndiff --git a/src/util/result.h b/src/util/result.h\nindex 5599da43dd..3c163cf398 100644\n--- a/src/util/result.h\n+++ b/src/util/result.h\n@@ -151,33 +151,35 @@ template <typename T, typename F = void>\n class Result : public detail::ResultBase<T, F>\n {\n protected:\n-    template <typename Fn, typename... Args>\n-    void Construct(const Fn& fn, Args&&... args)\n+    template <bool IsValueConstruction, typename... Args>\n+    void Construct(Args&&... args)\n     {\n-        fn(std::forward<Args>(args)...);\n+        if constexpr (IsValueConstruction) {\n+            this->ConstructValue(std::forward<Args>(args)...);\n+        } else {\n+            this->Info().failure.emplace(std::forward<Args>(args)...);\n+        }\n     }\n\n-    template <typename Fn, typename... Args>\n-    void Construct(const Fn& fn, Error error, Args&&... args)\n+    template <bool IsValueConstruction, typename... Args>\n+    void Construct(Error error, Args&&... args)\n     {\n         this->AddError(std::move(error.message));\n-        Construct([&](auto&&... x) {\n-            this->Info().failure.emplace(std::forward<decltype(x)>(x)...);\n-        }, std::forward<Args>(args)...);\n+        Construct<false /*always false from here on*/>(std::forward<Args>(args)...);\n     }\n\n-    template <typename Fn, typename... Args>\n-    void Construct(const Fn& fn, Warning warning, Args&&... args)\n+    template <bool IsValueConstruction, typename... Args>\n+    void Construct(Warning warning, Args&&... args)\n     {\n         this->AddWarning(std::move(warning.message));\n-        Construct(fn, std::forward<Args>(args)...);\n+        Construct<IsValueConstruction>(std::forward<Args>(args)...);\n     }\n\n-    template <typename Fn, typename OT, typename OF, typename... Args>\n-    void Construct(const Fn& fn, Result<OT, OF>&& other, Args&&... args)\n+    template <bool IsValueConstruction, typename OT, typename OF, typename... Args>\n+    void Construct(Result<OT, OF>&& other, Args&&... args)\n     {\n         this->MoveMessages(other);\n-        Construct(fn, std::forward<Args>(args)...);\n+        Construct<IsValueConstruction>(std::forward<Args>(args)...);\n     }\n\n     template <typename OT, typename OF>\n@@ -198,7 +200,8 @@ public:\n     template <typename... Args>\n     Result(Args&&... args)\n     {\n-        Construct([this](auto&&... x) { this->ConstructValue(std::forward<decltype(x)>(x)...); }, std::forward<Args>(args)...);\n+        // recursively peels of the first argument until we reach the base Construct method\n+        Construct<true>(std::forward<Args>(args)...);\n     }\n\n     template <typename OT, typename OF>\n```"
  },
  {
   "t": "2023-04-16T17:28:37Z",
   "kind": "review_comment",
   "who": "martinus",
   "assoc": "CONTRIBUTOR",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": null,
   "text": "Mayby explicitly mark the move-assignment as delete\n```cpp\ntemplate <typename OT, typename OF>\nResult& operator=(Result<OT, OF>&& other) = delete;\n```\n\nThen the compiler error messages are a bit nicer when one tries to move-assign"
  },
  {
   "t": "2023-04-16T17:33:03Z",
   "kind": "review_comment",
   "who": "martinus",
   "assoc": "CONTRIBUTOR",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": null,
   "text": "nit: I don't think the `if (!src.m_info->errors.empty())` check is necessary."
  },
  {
   "t": "2023-04-22T05:39:30Z",
   "kind": "review_comment",
   "who": "martinus",
   "assoc": "CONTRIBUTOR",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": null,
   "text": "maybe consider forbidding type `bool` for `T`. I recently had similar code in another project, and its utterly confusing; because Result can convert to bool but that only tells if it *has* a bool or not. It's very error prone."
  },
  {
   "t": "2023-04-22T05:45:40Z",
   "kind": "review_comment",
   "who": "martinus",
   "assoc": "CONTRIBUTOR",
   "path": "src/test/result_tests.cpp",
   "commit": "e1f22bfc9c7d95ab87740a6d7b060f41347f9532",
   "in_reply_to": null,
   "text": "I'd add a check somewhere to ensure that the size of the Result is as claimed in the commit message, something like that:\n\n```cpp\nstatic_assert(sizeof(util::Result<int>) == sizeof(void*)*2);\nstatic_assert(sizeof(util::Result<void>) == sizeof(void*));\n```"
  },
  {
   "t": "2023-04-22T13:22:08Z",
   "kind": "review_comment",
   "who": "martinus",
   "assoc": "CONTRIBUTOR",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": null,
   "text": "move constructors should usually be `noexcept`, but then all methods it uses also have to be `noexcept`."
  },
  {
   "t": "2023-04-22T13:28:31Z",
   "kind": "review_comment",
   "who": "martinus",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/spend.cpp",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": null,
   "text": "Could be just `return util::Error();`"
  },
  {
   "t": "2023-04-22T13:37:04Z",
   "kind": "comment",
   "who": "martinus",
   "assoc": "CONTRIBUTOR",
   "text": "After rebasing I get a compile error in `spend.cpp`  `ChooseSelectionResult`, adding a bunch of `std::move` helps"
  },
  {
   "t": "2023-04-22T14:22:36Z",
   "kind": "review_comment",
   "who": "martinus",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/spend.cpp",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": null,
   "text": "could be just `return util::Error();`"
  },
  {
   "t": "2023-04-22T14:25:26Z",
   "kind": "review",
   "who": "martinus",
   "assoc": "CONTRIBUTOR",
   "state": "CHANGES_REQUESTED",
   "commit": "2a9db070ec5acfe6843e44e1f8476f86899a8e29",
   "text": "Code review  2a9db07, apart from the compile error when rebasing I found mostly nits. This makes `util::Result` quite a bit more powerful, and it's still simple to use. The code itself of util::Result is a bit hard to understand though, but I don't have a better way either."
  },
  {
   "t": "2023-05-02T19:40:07Z",
   "kind": "review_comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "path": "src/test/result_tests.cpp",
   "commit": "e1f22bfc9c7d95ab87740a6d7b060f41347f9532",
   "in_reply_to": 1174298529,
   "text": "[quoted text omitted]\n\nThanks, added to result_tests.cpp"
  },
  {
   "t": "2023-05-02T19:40:16Z",
   "kind": "review_comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": 1167765212,
   "text": "re: https://github.com/bitcoin/bitcoin/pull/25722#discussion_r1167765212\n\n[quoted text omitted]\nSure, changed this."
  },
  {
   "t": "2023-05-02T19:40:58Z",
   "kind": "review_comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": 1167821634,
   "text": "re: https://github.com/bitcoin/bitcoin/pull/25722#discussion_r1167821634\n\n[quoted text omitted]\nThanks, that's much better! Took suggestion jsut renaming argument to \"Failure\""
  },
  {
   "t": "2023-05-02T19:41:38Z",
   "kind": "review_comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": 1167765326,
   "text": "re: https://github.com/bitcoin/bitcoin/pull/25722#discussion_r1167765212\n\n[quoted text omitted]\nSure, changed"
  },
  {
   "t": "2023-05-02T19:41:44Z",
   "kind": "review_comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": 1174414223,
   "text": "re: https://github.com/bitcoin/bitcoin/pull/25722#discussion_r1174414223\n\n[quoted text omitted]\nIt would be possible to add a constructor that move constructs `Result<T, F>` from `Result<OT, OF>` and is noexcept. For this to work, move constructing `T` from `OT` would have to be noexcept, and `F` and `OF` types would need to be identical so `unique_ptr<ErrorInfo<F>>`  could be moved without any allocations.\n\nRight now I'm just trying to do the simplest thing that's correct, and I think probably in most cases where the result class is used, having the move constructor be marked noexcept isn't going impact performance. But it is something that could be optimized later."
  },
  {
   "t": "2023-05-02T19:41:50Z",
   "kind": "review_comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": 1167981120,
   "text": "re: https://github.com/bitcoin/bitcoin/pull/25722#discussion_r1167981120\n\n[quoted text omitted]\nThanks, that changes error message from `error: object of type 'util::Result<int>' cannot be assigned because its copy assignment operator is implicitly deleted` to `error: overload resolution selected deleted operator=`, which should be more helpful now because a comment at the deleted `operator=` declaration explains why the operator is deleted and recommends using `Set()` instead"
  },
  {
   "t": "2023-05-02T19:41:56Z",
   "kind": "review_comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": 1167981676,
   "text": "re: https://github.com/bitcoin/bitcoin/pull/25722#discussion_r1167981676\n\n[quoted text omitted]\nIt's not strictly necessary, but it avoids allocating an ErrorInfo object in the common case where there are no errors or warnings. Since this is called whenever result objects are moved, it's good to avoid unnecessary allocations here."
  },
  {
   "t": "2023-05-02T19:42:12Z",
   "kind": "review_comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "path": "src/wallet/spend.cpp",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": 1174415841,
   "text": "re: https://github.com/bitcoin/bitcoin/pull/25722#discussion_r1174415841\n\n[quoted text omitted]\nThanks, simplified"
  },
  {
   "t": "2023-05-02T19:42:31Z",
   "kind": "review_comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "path": "src/wallet/spend.cpp",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": 1174422158,
   "text": "re: https://github.com/bitcoin/bitcoin/pull/25722#discussion_r1174422158\n\n[quoted text omitted]\nThanks, simplified"
  },
  {
   "t": "2023-05-03T18:13:04Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "f7d4451b98014176c083adc02bdf59e6dd2b9355"
  },
  {
   "t": "2023-06-19T12:09:40Z",
   "kind": "review_comment",
   "who": "sedited",
   "assoc": "MEMBER",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": 1174297928,
   "text": "I guess the same goes for something like `Result<std::optional<int>, int>`, or really any type implementing `operator bool()`? How did you handle these cases in your code? Sometimes the non-presence of a result is not really an error."
  },
  {
   "t": "2023-07-20T18:18:44Z",
   "kind": "review_comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "path": "src/util/result.h",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a",
   "in_reply_to": 1174297928,
   "text": "re: https://github.com/bitcoin/bitcoin/pull/25722#discussion_r1174297928\n\nI agree with all of this and want to do more work to address it.\n\nI think by default types convertible to bool should be disallowed with `Result`. I think `Result<bool>` or `Result<optional<T>>` types are inherently ambiguous and code accessing those return values would be fragile and prone to errors from dereferencing incorrectly.\n\nBut disallowing all types convertible to bool would go to far because being able to return types like `unique_ptr` and `shared_ptr` is important. Returning types like `Result<int>` should probably fine in practice too, even though ints are convertible to bool, and there could be a little ambiguity.\n\nSo there is some fine-tuning to be done here, and I want to code to be organized so `Result` and `ResultPtr` (#26022) classes handle this safety stuff, and `ResultBase` class handles all the real result functionality."
  },
  {
   "t": "2023-07-21T16:54:42Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "17891a95ab5873aa978a5bf5ed8985ee1513e728"
  },
  {
   "t": "2023-07-21T17:03:34Z",
   "kind": "review",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "17891a95ab5873aa978a5bf5ed8985ee1513e728",
   "text": "Rebased f7d4451b98014176c083adc02bdf59e6dd2b9355 -> 17891a95ab5873aa978a5bf5ed8985ee1513e728 ([`pr/bresult-load.16`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.16) -> [`pr/bresult-load.17`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.17), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.16-rebase..pr/bresult-load.17) making most of the suggested changes. I'm working on some more changes that should use `ResultPtr` from #26022 to simplify some of the code that has changed and made it safer. It will take more work to make `ResultPtr` compatible, and relatedly change the Result class to discourage using it with confusing types that are convertible to bool."
  },
  {
   "t": "2023-08-01T14:55:26Z",
   "kind": "comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "text": "Maybe mark as draft for as long as CI is red and this is based on something else?"
  },
  {
   "t": "2023-08-02T12:08:00Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "1a540b591c742594cca285ef9b8b16c6d8507d58"
  },
  {
   "t": "2023-09-25T18:08:12Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "1b2a5f12b42543d13a4bcafb9585e3d1df488914"
  },
  {
   "t": "2024-02-21T23:36:39Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "6700299bcb6f560e9e4caf34254d7d86d4e78833"
  },
  {
   "t": "2024-02-21T23:39:47Z",
   "kind": "comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "text": "Rebased 1b2a5f12b42543d13a4bcafb9585e3d1df488914 -> 6700299bcb6f560e9e4caf34254d7d86d4e78833 ([`pr/bresult-load.19`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.19) -> [`pr/bresult-load.20`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.20), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.19-rebase..pr/bresult-load.20)) on top of #26022 using #26022 to simplify some changes in this PR"
  },
  {
   "t": "2024-02-22T20:00:08Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "2385cb37dbbe00004f8bffe1d1d784778d89a21e"
  },
  {
   "t": "2024-02-22T20:14:40Z",
   "kind": "comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "text": "Updated 6700299bcb6f560e9e4caf34254d7d86d4e78833 -> 2385cb37dbbe00004f8bffe1d1d784778d89a21e ([`pr/bresult-load.20`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.20) -> [`pr/bresult-load.21`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.21), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.20..pr/bresult-load.21)) splitting this up from one big to commit to multiple commits so it is reasonable to review.\n\nHowever, looking over the commits, this still belongs in draft state, because since the time this PR was opened, a lot of improvements were made to the util::Result class in base PR #25665 based on review feedback, so there are a lot of updates that can be made in this PR to make it nicer."
  },
  {
   "t": "2024-05-01T17:57:39Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "987b28bbc991868ed305dbfc8f0846dd8b0b893c"
  },
  {
   "t": "2024-05-02T16:40:28Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "548bf508e26aae39c732b3e61861d5c29669df06"
  },
  {
   "t": "2024-05-02T22:02:03Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "ae0b9b8fcece154bae7f4383990e9d10f6cc0d2b"
  },
  {
   "t": "2024-05-03T15:15:10Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "5beaefaa806e54327d5995d86fd2d56d4687d575"
  },
  {
   "t": "2024-05-03T17:55:26Z",
   "kind": "comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "text": "Rebased 2385cb37dbbe00004f8bffe1d1d784778d89a21e -> 987b28bbc991868ed305dbfc8f0846dd8b0b893c ([`pr/bresult-load.21`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.21) -> [`pr/bresult-load.22`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.22), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.21-rebase..pr/bresult-load.22)) to use newer result API in #25722.\nUpdated 987b28bbc991868ed305dbfc8f0846dd8b0b893c -> 548bf508e26aae39c732b3e61861d5c29669df06 ([`pr/bresult-load.22`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.22) -> [`pr/bresult-load.23`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.23), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.22..pr/bresult-load.23)) to fix a bug in wallet tool and an accidental change to error message ordering\nUpdated 548bf508e26aae39c732b3e61861d5c29669df06 -> ae0b9b8fcece154bae7f4383990e9d10f6cc0d2b ([`pr/bresult-load.23`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.23) -> [`pr/bresult-load.24`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.24), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.23..pr/bresult-load.24)) to fix more unintended changes to error message order.\nUpdated ae0b9b8fcece154bae7f4383990e9d10f6cc0d2b -> 5beaefaa806e54327d5995d86fd2d56d4687d575 ([`pr/bresult-load.24`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.24) -> [`pr/bresult-load.25`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.25), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.24..pr/bresult-load.25)) to fix clang-tidy errors in https://cirrus-ci.com/task/6679456805289984 and ResultExtract bug in intermediate commit https://github.com/bitcoin/bitcoin/actions/runs/8931046064/job/24532379963?pr=25722"
  },
  {
   "t": "2024-06-17T23:08:14Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "e5e29399ddf6af0520c1e0f5949383d597c9a09d"
  },
  {
   "t": "2024-06-18T15:04:41Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "c39b4ab6c592decc5a79c14d4ac8bafa7693f647"
  },
  {
   "t": "2024-06-20T12:33:09Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "089c58f5b0fa26aa8eeb2889ead48590f16398bb"
  },
  {
   "t": "2024-07-18T19:24:12Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "f8c5f3d640d96a335c0c36966dbb6a9332647449"
  },
  {
   "t": "2024-07-19T13:17:40Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "2b0e70295ed6ff4be91cc5775ddaa9351a1ed430"
  },
  {
   "t": "2024-11-04T13:36:15Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "caed6aec4241a2e5d849c9446725c889348e1b7e"
  },
  {
   "t": "2024-11-04T13:38:57Z",
   "kind": "comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "text": "Rebased 2b0e70295ed6ff4be91cc5775ddaa9351a1ed430 -> caed6aec4241a2e5d849c9446725c889348e1b7e ([`pr/bresult-load.30`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.30) -> [`pr/bresult-load.31`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.31), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.30-rebase..pr/bresult-load.31)) due to various conflicts\nUpdated caed6aec4241a2e5d849c9446725c889348e1b7e -> 830570fe684e05c170def209633c682363d3b830 ([`pr/bresult-load.31`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.31) -> [`pr/bresult-load.32`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.32), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.31..pr/bresult-load.32)) to fix DoMigration error handling bug https://github.com/bitcoin/bitcoin/actions/runs/11665336901/job/32477794828?pr=25722\nRebased 830570fe684e05c170def209633c682363d3b830 -> e2376f9847c8cd07bb5f2c82f8b0055a72086b66 ([`pr/bresult-load.32`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.32) -> [`pr/bresult-load.33`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.33), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.32-rebase..pr/bresult-load.33)) due to various conflicts\nRebased e2376f9847c8cd07bb5f2c82f8b0055a72086b66 -> 0284396a4229025a6201d7486484b17c00f3eb8c ([`pr/bresult-load.33`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.33) -> [`pr/bresult-load.34`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.34), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.33-rebase..pr/bresult-load.34)) due to conflicts with #31241, #31451, and other PRs\nRebased 0284396a4229025a6201d7486484b17c00f3eb8c -> 88dfdac4bc23c87f79c55ed6b2c255f29137768e ([`pr/bresult-load.34`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.34) -> [`pr/bresult-load.35`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.35), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.34-rebase..pr/bresult-load.35)) due to conflicts with #31961 and #31519\n\nRebased 88dfdac4bc23c87f79c55ed6b2c255f29137768e -> 96f66136f02833f00520eb18e32d0a2848cb4c2a ([`pr/bresult-load.35`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.35) -> [`pr/bresult-load.36`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.36), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.35-rebase..pr/bresult-load.36))\n\nRebased 96f66136f02833f00520eb18e32d0a2848cb4c2a -> fdff2b4550e8b2b64e25d413298283fa1b516088 ([`pr/bresult-load.36`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.36) -> [`pr/bresult-load.37`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.37), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.36-rebase..pr/bresult-load.37))\n\nRebased fdff2b4550e8b2b64e25d413298283fa1b516088 -> 46d01725ed1434fba8d974f57f6893e2cd1facee ([`pr/bresult-load.37`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.37) -> [`pr/bresult-load.38`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.38), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.37-rebase..pr/bresult-load.38)) due to conflict with #30595\n\nRebased 46d01725ed1434fba8d974f57f6893e2cd1facee -> 2dc6d076e76f9c778dbced9adfd0ef64aea732b1 ([`pr/bresult-load.38`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.38) -> [`pr/bresult-load.39`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.39), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.38-rebase..pr/bresult-load.39)) on top of updated base PR to fix CI errors\n\nRebased 2dc6d076e76f9c778dbced9adfd0ef64aea732b1 -> d3e677f59d6369dc295edb7b5f112b83f99ec3c9 ([`pr/bresult-load.39`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.39) -> [`pr/bresult-load.40`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.40), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.39-rebase..pr/bresult-load.40))\n\nRebased d3e677f59d6369dc295edb7b5f112b83f99ec3c9 -> 2c7996d7c398b0927008a1903aad786d81c3e949 ([`pr/bresult-load.40`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.40) -> [`pr/bresult-load.41`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.41), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.40-rebase..pr/bresult-load.41))\n\nRebased 2c7996d7c398b0927008a1903aad786d81c3e949 -> 06c3f0abda7bf258993c7c1742502d511574a50e ([`pr/bresult-load.41`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.41) -> [`pr/bresult-load.42`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.42), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.41-rebase..pr/bresult-load.42)) on top of #26022 pr/bresult-ptr.17\n\nUpdated 06c3f0abda7bf258993c7c1742502d511574a50e -> 45da1d9a13b26d5030354c7d5d874fd59cf35d84 ([`pr/bresult-load.42`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.42) -> [`pr/bresult-load.43`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.43), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.42..pr/bresult-load.43)) to fix CI errors https://github.com/bitcoin/bitcoin/actions/runs/21101803730/job/60687048929?pr=25722\n\nRebased 45da1d9a13b26d5030354c7d5d874fd59cf35d84 -> 23df7666d1cfae87609b0054e7184bfad71467dd ([`pr/bresult-load.43`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.43) -> [`pr/bresult-load.44`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.44), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.43-rebase..pr/bresult-load.44)) on top of #25665 pr/bresult2.73 due to conflicts with #31650 and #34269\n\nAdded 1 commits 23df7666d1cfae87609b0054e7184bfad71467dd -> 9382817901067c57b5ff4044d4c7aa09aee25376 ([`pr/bresult-load.44`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.44) -> [`pr/bresult-load.45`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.45), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.44...pr/bresult-load.45)) to fix ci iwyu error https://github.com/bitcoin/bitcoin/actions/runs/21266012856/job/61207857203?pr=25722\n\nRebased 9382817901067c57b5ff4044d4c7aa09aee25376 -> e164e1e7a5c89eab4c0ef30a4a772a249a95ce0c ([`pr/bresult-load.45`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.45) -> [`pr/bresult-load.46`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.46), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.45-rebase..pr/bresult-load.46)) due to conflicts with #32636\n\nUpdated e164e1e7a5c89eab4c0ef30a4a772a249a95ce0c -> 8253c7087f2cd7f5d0e3e35f39120e29557be846 ([`pr/bresult-load.46`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.46) -> [`pr/bresult-load.47`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.47), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.46..pr/bresult-load.47)) to fix tidy and iwyu errors https://github.com/bitcoin/bitcoin/actions/runs/21833918575/job/62999419836?pr=25722\n\nRebased 8253c7087f2cd7f5d0e3e35f39120e29557be846 -> d75ff7517eb28aa549a0fcfaa93c7fa20f391055 ([`pr/bresult-load.47`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.47) -> [`pr/bresult-load.48`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.48), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.47-rebase..pr/bresult-load.48)) on top of #25665 pr/bresult2.76\n\nRebased d75ff7517eb28aa549a0fcfaa93c7fa20f391055 -> 89c866499cfc52496327cef6294b40ac7a3ae512 ([`pr/bresult-load.48`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.48) -> [`pr/bresult-load.49`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.49), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.48-rebase..pr/bresult-load.49)) on top of #25665 pr/bresult2.77\n\nRebased 89c866499cfc52496327cef6294b40ac7a3ae512 -> 04c5995eec3ff5d82f097069ebf6f33715e70513 ([`pr/bresult-load.49`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.49) -> [`pr/bresult-load.50`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.50), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.49-rebase..pr/bresult-load.50)) on top of #25665 pr/bresult2.79 and pr/bresult-ptr.20 #26022\n\nRebased 04c5995eec3ff5d82f097069ebf6f33715e70513 -> 91c331c76d34ad0a5ef112543af984a832d8a039 ([`pr/bresult-load.50`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.50) -> [`pr/bresult-load.51`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.51), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.50-rebase..pr/bresult-load.51)) on top of #25665 pr/bresult2.79 and #26022 pr/bresult-ptr.20 due to conflict with #28333\n\nRebased 91c331c76d34ad0a5ef112543af984a832d8a039 -> a268356d39fbad77c871a006164a9f9e58e39d90 ([`pr/bresult-load.51`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.51) -> [`pr/bresult-load.52`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.52), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.51-rebase..pr/bresult-load.52)) on top of #26022 pr/bresult-ptr.21 due to conflict with #35182 (libevent replacement)\n\nRebased a268356d39fbad77c871a006164a9f9e58e39d90 -> 2040c025062f30626fd998ee6f582a771f1913f4 ([`pr/bresult-load.52`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.52) -> [`pr/bresult-load.53`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.53), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.52-rebase..pr/bresult-load.53)) due to conflict with #35266\n\nUpdated 2040c025062f30626fd998ee6f582a771f1913f4 -> 036ce1d818c98bba047fb11b978c99b72de55e04 ([`pr/bresult-load.53`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.53) -> [`pr/bresult-load.54`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.54), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.53..pr/bresult-load.54)) to fix iwyu errors (util/translation.h \u2192 util/result.h in bench files) https://github.com/bitcoin/bitcoin/actions/runs/28131393626/job/83308198030\n\nRebased 036ce1d818c98bba047fb11b978c99b72de55e04 -> 2bbdb750757d5c079732f632a977bf9680e8a59e ([`pr/bresult-load.54`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.54) -> [`pr/bresult-load.55`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.55), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.54-rebase..pr/bresult-load.55)) on top of #26022 pr/bresult-ptr.22 due to conflicts with #35655\n\nRebased 2bbdb750757d5c079732f632a977bf9680e8a59e -> 090e9ba606bf9a217bcd86393424e5c3934e4cf5 ([`pr/bresult-load.55`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.55) -> [`pr/bresult-load.56`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.56), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.55-rebase..pr/bresult-load.56)) on top of #26022 pr/bresult-ptr.23 due to conflicts with bitcoin-core/gui#953 and #35914\n\nRebased 090e9ba606bf9a217bcd86393424e5c3934e4cf5 -> 19e31d14092f2a6189f834168d60d373470b410b ([`pr/bresult-load.56`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.56) -> [`pr/bresult-load.57`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.57), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.56-rebase..pr/bresult-load.57)) on top of #26022 pr/bresult-ptr.23 due to conflicts with #35955\n\nRebased 19e31d14092f2a6189f834168d60d373470b410b -> 109d356f8ffa70218f3965435ab116837f2006eb ([`pr/bresult-load.57`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.57) -> [`pr/bresult-load.58`](https://github.com/ryanofsky/bitcoin/commits/pr/bresult-load.58), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/bresult-load.57-rebase..pr/bresult-load.58)) due to conflicts with #36127"
  },
  {
   "t": "2024-11-04T15:54:53Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "830570fe684e05c170def209633c682363d3b830"
  },
  {
   "t": "2024-12-06T12:18:23Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "e2376f9847c8cd07bb5f2c82f8b0055a72086b66"
  },
  {
   "t": "2025-03-12T02:23:42Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "0284396a4229025a6201d7486484b17c00f3eb8c"
  },
  {
   "t": "2025-03-20T17:59:16Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "88dfdac4bc23c87f79c55ed6b2c255f29137768e"
  },
  {
   "t": "2025-08-01T23:15:29Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "96f66136f02833f00520eb18e32d0a2848cb4c2a"
  },
  {
   "t": "2025-10-15T00:42:04Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "fdff2b4550e8b2b64e25d413298283fa1b516088"
  },
  {
   "t": "2025-11-11T22:15:29Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "46d01725ed1434fba8d974f57f6893e2cd1facee"
  },
  {
   "t": "2025-11-12T16:06:24Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "2dc6d076e76f9c778dbced9adfd0ef64aea732b1"
  },
  {
   "t": "2025-12-12T12:19:24Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "d3e677f59d6369dc295edb7b5f112b83f99ec3c9"
  },
  {
   "t": "2025-12-16T02:10:39Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "2c7996d7c398b0927008a1903aad786d81c3e949"
  },
  {
   "t": "2026-01-17T22:24:46Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "aa17527d48cb5428558988603ac68b66f2dc06b8"
  },
  {
   "t": "2026-01-18T00:58:09Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "c8c80f9198bd8b8882eb8526e4f093205be68ec8"
  },
  {
   "t": "2026-01-22T21:45:22Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "7a897eb8a449b1de63feaae4cf493950c8199240"
  }
 ],
 "labels_log": [
  {
   "t": "2022-07-27T19:44:45Z",
   "action": "labeled",
   "label": "Refactoring",
   "who": "DrahtBot"
  },
  {
   "t": "2022-08-05T13:55:13Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-08-05T20:13:04Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-08-10T17:37:21Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-08-15T19:19:11Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-08-16T18:26:16Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-09-01T17:03:15Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-09-13T16:34:17Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-09-15T17:19:09Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-09-16T10:15:42Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-09-20T18:07:05Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-10-03T14:46:54Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-10-14T23:25:11Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-12-01T11:04:54Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-01-20T22:02:50Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-01-23T19:57:02Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-02-11T00:46:16Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-02-17T19:16:16Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-03-01T19:55:57Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-03-08T00:33:13Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-04-07T02:06:04Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-04-12T18:04:32Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-04-13T02:21:09Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-04-23T23:17:32Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-02T17:55:07Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-03T19:03:44Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-03T19:17:36Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-15T12:00:49Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-07-21T18:13:00Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-07-21T20:16:36Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-08-02T13:58:09Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-08-24T12:14:18Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-09-25T18:58:39Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-10-05T14:10:40Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-10-16T16:18:58Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-02-22T00:56:44Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-02-22T01:13:13Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-04-30T18:38:11Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-05-01T19:48:01Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-05-01T22:42:20Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-05-03T17:27:50Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-05-20T11:58:39Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-06-17T23:31:38Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-06-18T02:33:24Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-06-20T14:21:57Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-02T11:19:59Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-18T22:46:23Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-18T23:36:35Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-19T14:33:11Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-15T20:19:21Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-11-04T15:09:39Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-11-04T15:21:43Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-11-04T17:52:02Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-04T13:02:52Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-06T13:07:43Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-01-17T13:26:01Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-12T03:15:06Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-14T03:53:09Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-20T18:57:54Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-27T07:48:55Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-08-02T01:11:48Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-08-08T17:45:48Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-10-15T00:58:04Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-11-04T17:49:01Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-11-11T23:15:23Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-11-11T23:21:14Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-09T02:45:28Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-12T13:18:25Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-15T16:08:59Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-16T02:46:42Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-16T05:38:16Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-16T15:46:17Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-17T23:15:46Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-17T23:57:11Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-18T02:22:16Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-19T11:12:11Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  }
 ],
 "state_log": [
  {
   "t": "2022-08-15T18:18:25Z",
   "kind": "ready_for_review",
   "who": "ryanofsky"
  },
  {
   "t": "2023-08-01T17:42:23Z",
   "kind": "convert_to_draft",
   "who": "ryanofsky"
  }
 ],
 "text_chars": 36994,
 "text_tokens_estimate": 9248,
 "changed_paths": [
  ".github/workflows/ci.yml",
  "ci/test/00_setup_env_native_previous_releases.sh",
  "src/addrdb.cpp",
  "src/addrdb.h",
  "src/bench/wallet_create.cpp",
  "src/bench/wallet_loading.cpp",
  "src/init.cpp",
  "src/interfaces/wallet.h",
  "src/kernel/CMakeLists.txt",
  "src/kernel/bitcoinkernel.cpp",
  "src/node/chainstate.cpp",
  "src/node/chainstate.h",
  "src/qt/test/addressbooktests.cpp",
  "src/qt/test/wallettests.cpp",
  "src/qt/walletcontroller.cpp",
  "src/test/result_tests.cpp",
  "src/test/util/setup_common.cpp",
  "src/util/CMakeLists.txt",
  "src/util/messages.cpp",
  "src/util/messages.h",
  "src/util/result.h",
  "src/wallet/db.h",
  "src/wallet/dump.cpp",
  "src/wallet/dump.h",
  "src/wallet/export.cpp",
  "src/wallet/interfaces.cpp",
  "src/wallet/load.cpp",
  "src/wallet/migrate.cpp",
  "src/wallet/migrate.h",
  "src/wallet/rpc/backup.cpp",
  "src/wallet/rpc/util.cpp",
  "src/wallet/rpc/util.h",
  "src/wallet/rpc/wallet.cpp",
  "src/wallet/sqlite.cpp",
  "src/wallet/sqlite.h",
  "src/wallet/test/db_tests.cpp",
  "src/wallet/test/fuzz/wallet_bdb_parser.cpp",
  "src/wallet/test/util.cpp",
  "src/wallet/test/wallet_tests.cpp",
  "src/wallet/test/walletload_tests.cpp",
  "src/wallet/wallet.cpp",
  "src/wallet/wallet.h",
  "src/wallet/walletdb.cpp",
  "src/wallet/wallettool.cpp"
 ],
 "files": [
  {
   "path": ".github/workflows/ci.yml",
   "add": 1,
   "del": 1
  },
  {
   "path": "ci/test/00_setup_env_native_previous_releases.sh",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/addrdb.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/addrdb.h",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/bench/wallet_create.cpp",
   "add": 5,
   "del": 10
  },
  {
   "path": "src/bench/wallet_loading.cpp",
   "add": 7,
   "del": 7
  },
  {
   "path": "src/init.cpp",
   "add": 22,
   "del": 21
  },
  {
   "path": "src/interfaces/wallet.h",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/kernel/CMakeLists.txt",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/kernel/bitcoinkernel.cpp",
   "add": 7,
   "del": 7
  },
  {
   "path": "src/node/chainstate.cpp",
   "add": 56,
   "del": 39
  },
  {
   "path": "src/node/chainstate.h",
   "add": 6,
   "del": 22
  },
  {
   "path": "src/qt/test/addressbooktests.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/qt/test/wallettests.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/qt/walletcontroller.cpp",
   "add": 29,
   "del": 16
  },
  {
   "path": "src/test/result_tests.cpp",
   "add": 230,
   "del": 11
  },
  {
   "path": "src/test/util/setup_common.cpp",
   "add": 4,
   "del": 4
  },
  {
   "path": "src/util/CMakeLists.txt",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/util/messages.cpp",
   "add": 30,
   "del": 0
  },
  {
   "path": "src/util/messages.h",
   "add": 53,
   "del": 0
  },
  {
   "path": "src/util/result.h",
   "add": 399,
   "del": 62
  },
  {
   "path": "src/wallet/db.h",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/wallet/dump.cpp",
   "add": 49,
   "del": 54
  },
  {
   "path": "src/wallet/dump.h",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/wallet/export.cpp",
   "add": 6,
   "del": 5
  },
  {
   "path": "src/wallet/interfaces.cpp",
   "add": 32,
   "del": 32
  },
  {
   "path": "src/wallet/load.cpp",
   "add": 22,
   "del": 25
  },
  {
   "path": "src/wallet/migrate.cpp",
   "add": 3,
   "del": 7
  },
  {
   "path": "src/wallet/migrate.h",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/wallet/rpc/backup.cpp",
   "add": 5,
   "del": 7
  },
  {
   "path": "src/wallet/rpc/util.cpp",
   "add": 11,
   "del": 11
  },
  {
   "path": "src/wallet/rpc/util.h",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/wallet/rpc/wallet.cpp",
   "add": 20,
   "del": 19
  },
  {
   "path": "src/wallet/sqlite.cpp",
   "add": 37,
   "del": 33
  },
  {
   "path": "src/wallet/sqlite.h",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/wallet/test/db_tests.cpp",
   "add": 3,
   "del": 9
  },
  {
   "path": "src/wallet/test/fuzz/wallet_bdb_parser.cpp",
   "add": 3,
   "del": 6
  },
  {
   "path": "src/wallet/test/util.cpp",
   "add": 7,
   "del": 15
  },
  {
   "path": "src/wallet/test/wallet_tests.cpp",
   "add": 3,
   "del": 6
  },
  {
   "path": "src/wallet/test/walletload_tests.cpp",
   "add": 2,
   "del": 4
  },
  {
   "path": "src/wallet/wallet.cpp",
   "add": 270,
   "del": 254
  },
  {
   "path": "src/wallet/wallet.h",
   "add": 12,
   "del": 13
  },
  {
   "path": "src/wallet/walletdb.cpp",
   "add": 12,
   "del": 27
  },
  {
   "path": "src/wallet/wallettool.cpp",
   "add": 27,
   "del": 28
  }
 ],
 "test_lines": 342,
 "git": {
  "head": "e1f22bfc9c7d95ab87740a6d7b060f41347f9532",
  "head_matches_backup": true,
  "base": "33a363ea250839ca31ea043b7500789d2e5d844b",
  "commits": [
   {
    "sha": "5dd221497c",
    "subject": "refactor: Add util::Result failure values",
    "files": 3,
    "add": 335,
    "del": 65
   },
   {
    "sha": "a649feba60",
    "subject": "wallet: fix clang-tidy warning performance-no-automatic-move",
    "files": 1,
    "add": 1,
    "del": 1
   },
   {
    "sha": "51932a8005",
    "subject": "refactor: Add util::Result::Update() method",
    "files": 2,
    "add": 51,
    "del": 7
   },
   {
    "sha": "e9d494ca7e",
    "subject": "refactor: Use util::Result class in LoadChainstate and VerifyLoadedChainstate",
    "files": 5,
    "add": 94,
    "del": 92
   },
   {
    "sha": "69f8f77588",
    "subject": "refactor: Add util::Result multiple error and warning messages",
    "files": 6,
    "add": 271,
    "del": 30
   },
   {
    "sha": "5a38099ffe",
    "subject": "test: add static test for util::Result memory usage",
    "files": 2,
    "add": 7,
    "del": 1
   },
   {
    "sha": "95c744333e",
    "subject": "ci: Avoid -Wno-error=maybe-uninitialized false positives",
    "files": 1,
    "add": 1,
    "del": 1
   },
   {
    "sha": "781faa65b0",
    "subject": "Merge branch 'pr/bresult2' into pr/bresult-ptr",
    "files": 13,
    "add": 732,
    "del": 169
   },
   {
    "sha": "a44b2336cb",
    "subject": "Add util::ResultPtr class",
    "files": 2,
    "add": 62,
    "del": 0
   },
   {
    "sha": "42daa09f9b",
    "subject": "Use ResultPtr<unique_ptr> instead of Result<unique_ptr>",
    "files": 6,
    "add": 18,
    "del": 29
   },
   {
    "sha": "236bb65266",
    "subject": "Merge branch 'pr/bresult-ptr' into pr/bresult-load",
    "files": 18,
    "add": 812,
    "del": 198
   },
   {
    "sha": "8d998440c6",
    "subject": "Add temporary ResultExtract helper for porting to util::Result",
    "files": 1,
    "add": 31,
    "del": 0
   },
   {
    "sha": "ec7c42ab3d",
    "subject": "refactor: Use util::Result class in wallet/sqlite",
    "files": 4,
    "add": 44,
    "del": 45
   },
   {
    "sha": "e38aad68ca",
    "subject": "refactor: Use util::Result class in wallet/migrate",
    "files": 4,
    "add": 7,
    "del": 10
   },
   {
    "sha": "4fea959bb7",
    "subject": "refactor: Use util::Result class in wallet::MakeDatabase",
    "files": 5,
    "add": 19,
    "del": 33
   },
   {
    "sha": "3d47aba634",
    "subject": "refactor: Use util::Result class in wallet/dump",
    "files": 4,
    "add": 59,
    "del": 59
   },
   {
    "sha": "a6a0feca6f",
    "subject": "refactor: Use util::Result class in wallet/wallettool",
    "files": 1,
    "add": 19,
    "del": 24
   },
   {
    "sha": "d2ca7d8694",
    "subject": "refactor: Use util::Result class in wallet/wallet",
    "files": 16,
    "add": 347,
    "del": 320
   },
   {
    "sha": "76d6541f56",
    "subject": "refactor: Use util::Result class in wallet/load",
    "files": 1,
    "add": 22,
    "del": 25
   },
   {
    "sha": "480a59b0ad",
    "subject": "refactor: Use util::Result class in wallet/rpc",
    "files": 4,
    "add": 30,
    "del": 30
   },
   {
    "sha": "dea22903f6",
    "subject": "refactor: Use util::Result class in wallet/interfaces",
    "files": 3,
    "add": 65,
    "del": 41
   },
   {
    "sha": "6a56e0c7da",
    "subject": "refactor: Use util::Result class in wallet/test",
    "files": 5,
    "add": 13,
    "del": 27
   },
   {
    "sha": "4d7a5352df",
    "subject": "Drop temporary ResultExtract helper for porting to util::Result",
    "files": 1,
    "add": 0,
    "del": 31
   },
   {
    "sha": "109d356f8f",
    "subject": "scripted-diff: replace wallet DatabaseStatus with DatabaseError",
    "files": 12,
    "add": 64,
    "del": 65
   },
   {
    "sha": "e1f22bfc9c",
    "subject": "test-each-commit: Increase fetch depth",
    "files": 1,
    "add": 1,
    "del": 1
   }
  ],
  "patch_truncated": true
 },
 "input_hash": "105a386a7a16a106",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}