{
 "number": 27260,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/27260",
 "title": "Enhanced error messages for invalid network prefix during address parsing.",
 "author": "portlandhodl",
 "author_association": "FIRST_TIME_CONTRIBUTOR",
 "created_at": "2023-03-15T10:17:16Z",
 "updated_at": "2026-08-30T02:02:31Z",
 "age_days": 1282,
 "draft": true,
 "labels": [
  "RPC/REST/ZMQ",
  "Needs rebase"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "5f7fdc05f62c5ae40a995aaf8e2d4289658cec67",
 "head_ref": "26290",
 "head_repo": "portlandhodl/bitcoin",
 "head_history": [
  {
   "t": "2023-03-15T11:07:49Z",
   "sha": "d9654cf211db24080592834b61c0de0f9bf6a8c9"
  },
  {
   "t": "2023-03-15T11:36:02Z",
   "sha": "0f1b1dcd130eed9837bd8e8ca4f3e851fe62abcb"
  },
  {
   "t": "2023-03-15T11:45:40Z",
   "sha": "fbf9f6bb876f2e7bbfe2c6315a9e4a8da504e27e"
  },
  {
   "t": "2023-03-15T11:54:38Z",
   "sha": "269f08044580d128c13f7981e3bbf9e3235e3a60"
  },
  {
   "t": "2023-03-15T12:16:05Z",
   "sha": "edff3dc42601e097fbbef1f073d71e0d5201c996"
  },
  {
   "t": "2023-03-15T23:57:57Z",
   "sha": "770591b052076b13440706d60d363e8aee686bc8"
  },
  {
   "t": "2023-03-16T00:04:37Z",
   "sha": "c98f7cc7cf65321116ff437cd4b3a297cd396e47"
  },
  {
   "t": "2023-03-16T00:10:00Z",
   "sha": "911c8b60c6336322e7a6c24f035b1f6f2e23ae51"
  },
  {
   "t": "2023-03-18T05:02:31Z",
   "sha": "30fc8d5d2e6549cebf5962d85102b2a5bbe5f653"
  },
  {
   "t": "2023-03-19T08:07:23Z",
   "sha": "c30cfb3f8bef6ad18e9fd439fe1d0ad773a31d23"
  },
  {
   "t": "2023-03-19T08:09:30Z",
   "sha": "b0d7527c2e76ed1d43c67bd1964e99733989a163"
  },
  {
   "t": "2023-03-19T08:10:58Z",
   "sha": "5039dd235cee3c3e73cf3d23f638e77302cea49f"
  },
  {
   "t": "2023-03-19T08:14:06Z",
   "sha": "3c0fcda0fc958e455f21d37af359a0c67350d8a4"
  },
  {
   "t": "2023-03-19T08:50:42Z",
   "sha": "aff763576a433c64a951c9b0e64741665d1d34ba"
  },
  {
   "t": "2023-05-18T20:10:45Z",
   "sha": "d6177846475268064b59548dd2f0ecec5826e75e"
  },
  {
   "t": "2023-05-19T03:09:01Z",
   "sha": "5ff24900695bc6ecf7b99335d5a20aee477fde37"
  },
  {
   "t": "2023-05-19T23:07:23Z",
   "sha": "56908f19b88213d34c422a09e4f6b685d24138a2"
  },
  {
   "t": "2023-06-23T02:33:21Z",
   "sha": "603e8dedf50b8a4a15a8849cdb9a84286d9a7675"
  },
  {
   "t": "2023-06-23T02:39:19Z",
   "sha": "56908f19b88213d34c422a09e4f6b685d24138a2"
  },
  {
   "t": "2023-06-23T02:41:32Z",
   "sha": "c6e9f046dd766a18b0a42f4a6332d99da3408c8a"
  },
  {
   "t": "2023-06-23T02:49:44Z",
   "sha": "4a577341c8ad61bc262ceea1fd1f042b71a5f0ea"
  },
  {
   "t": "2023-07-09T19:43:17Z",
   "sha": "0e6c2f88177f22e7509aab3fbaec2786a7a49ce1"
  },
  {
   "t": "2023-07-09T20:12:55Z",
   "sha": "335ad790a02197069357223bfa79c4b509f09d9b"
  },
  {
   "t": "2023-07-10T04:29:22Z",
   "sha": "8f2e548f6276386c27a60336cf12665d5e316fb7"
  },
  {
   "t": "2023-07-15T08:14:38Z",
   "sha": "845fa6fc2f9de842b510ac57c8d52a8487600063"
  },
  {
   "t": "2023-07-15T08:29:00Z",
   "sha": "ed855375784396175995f72fef723ac088f2ab5f"
  },
  {
   "t": "2023-07-15T09:10:09Z",
   "sha": "8a1c62d33ba1bbd064e9b6fcb556c9097140fb58"
  },
  {
   "t": "2023-07-15T09:16:26Z",
   "sha": "5d7d1c09d50c46bc1b3dce99db599f6cdb234860"
  },
  {
   "t": "2023-07-15T09:22:22Z",
   "sha": "81b9c3acf19525eb22f18fe019c47a1e379d5fdc"
  },
  {
   "t": "2023-07-15T09:34:56Z",
   "sha": "1a358ee99b20534c396e555b91459dd72ab431d4"
  },
  {
   "t": "2023-07-15T09:44:51Z",
   "sha": "aac6db2b1e843539758162fb43bdbeeb911a33e4"
  },
  {
   "t": "2023-07-15T09:58:32Z",
   "sha": "5a5e8dccea60baf8f9cbeaff1e72cc25f9339521"
  },
  {
   "t": "2023-07-22T08:14:09Z",
   "sha": "a1ef5ebdf1b93d7baace42e0ee6e9626ab28f58d"
  },
  {
   "t": "2023-07-22T08:17:57Z",
   "sha": "991061487352cf6b10de00b7fad5042121da87ec"
  },
  {
   "t": "2023-07-23T05:46:46Z",
   "sha": "90fc3d8d98635b04269b49cbf4ca8db65a4fe124"
  },
  {
   "t": "2023-07-23T06:16:33Z",
   "sha": "4cf388dceea8b49511c7f569a60f6cd87aae8f05"
  },
  {
   "t": "2023-07-23T06:33:26Z",
   "sha": "5db8d67d88575f1fc481564a6bb8ba0f0f3579d5"
  },
  {
   "t": "2023-07-23T06:36:50Z",
   "sha": "c36a17b87cca5529191d814b282831a5aab2ab4f"
  },
  {
   "t": "2023-07-25T11:04:48Z",
   "sha": "035689d2462ff1f71343ba45a760ceb97850bb4a"
  },
  {
   "t": "2023-07-25T11:10:23Z",
   "sha": "fc8d67628374ecd4e36f162735a3b40877d0cea4"
  },
  {
   "t": "2023-07-25T11:12:35Z",
   "sha": "cda72da0ec792900b3957fff21060bf2555c309b"
  },
  {
   "t": "2023-07-25T20:10:04Z",
   "sha": "b0623b26de89384e0f3aa485227414fa842de89a"
  },
  {
   "t": "2023-07-25T20:12:57Z",
   "sha": "bf45422b1ffa9ed9935a79ef4ec6700f02380b2a"
  },
  {
   "t": "2023-07-25T20:17:19Z",
   "sha": "013072685c10c6dc2c12099fddea93459f567698"
  },
  {
   "t": "2023-07-25T20:41:01Z",
   "sha": "658d77d642a027f0a523529339f2f663b7d8b1a5"
  },
  {
   "t": "2023-07-28T07:04:02Z",
   "sha": "b66e974ac8f21971602051c08df830d14cf3df7e"
  },
  {
   "t": "2023-09-06T19:38:54Z",
   "sha": "8ba7483c18a8ba0799d246658cb4267c7a87f7bf"
  },
  {
   "t": "2023-09-06T21:55:44Z",
   "sha": "5dbe9dc1a56d5505bee751fa63a0ac1d983a4a7c"
  },
  {
   "t": "2023-09-08T03:47:36Z",
   "sha": "0b5f317156d6b806ebf7e4db2c756645569af364"
  },
  {
   "t": "2023-09-08T04:26:30Z",
   "sha": "d6d9c5cf05e019ea3ab9a145965517e05c8e19bd"
  },
  {
   "t": "2023-09-08T16:41:50Z",
   "sha": "14b8205f6360cf4e35a958e8a96a7d657afaf8ce"
  },
  {
   "t": "2023-09-08T16:47:00Z",
   "sha": "700967063fab712d2acf982f77ebc9b70ff49aa6"
  },
  {
   "t": "2023-09-08T17:08:00Z",
   "sha": "dcb2d2b2c7805cdf5e9ec65c6aeb77b399b676f9"
  },
  {
   "t": "2023-09-09T05:09:05Z",
   "sha": "303308e3fcf4ba6b5e10fc516bdf591415f80d99"
  },
  {
   "t": "2023-09-09T05:54:54Z",
   "sha": "d75fe6bda6df4ca31e9cafa645d7b98e87251bce"
  },
  {
   "t": "2023-09-09T06:15:32Z",
   "sha": "6fc553aa40bea8038b973ba3a088f159957085ba"
  },
  {
   "t": "2023-09-09T06:28:43Z",
   "sha": "c4580d02810edddf7f0521d8f86d537fe280834d"
  },
  {
   "t": "2023-09-09T06:33:13Z",
   "sha": "6fc553aa40bea8038b973ba3a088f159957085ba"
  },
  {
   "t": "2023-09-09T06:38:19Z",
   "sha": "f1a6574d51ea753cfe8f0aa0c1d5b13cd73ad5a0"
  },
  {
   "t": "2023-09-09T06:51:06Z",
   "sha": "fdd43caeaea61e5eb52119a69dfe338085422703"
  },
  {
   "t": "2023-09-09T06:59:26Z",
   "sha": "8c2f7a10cf256c4f1d39496f421cbb24d45f4bef"
  },
  {
   "t": "2023-09-09T07:05:05Z",
   "sha": "8b7a94cc908238a45fa26d2f355d2c9c60fba2d4"
  },
  {
   "t": "2023-09-09T14:11:26Z",
   "sha": "7477465b539a449749ce1b02d81462d0d0fc3bcb"
  },
  {
   "t": "2023-09-09T14:21:00Z",
   "sha": "2de9dbefcf6d5e498cf8034834444eedfe051b54"
  },
  {
   "t": "2023-09-09T15:18:27Z",
   "sha": "c6bf28ff4f126e7c3c4814397ffbac147951eecf"
  },
  {
   "t": "2023-09-09T15:21:40Z",
   "sha": "02f442d615783b3541faf2f5dab99df58744a86d"
  },
  {
   "t": "2023-09-09T15:30:07Z",
   "sha": "7397518101fc0f8f56afe41b2d7b9f44946ebb70"
  },
  {
   "t": "2023-09-09T18:41:48Z",
   "sha": "62aa7f6d237e472b2df6defb4c6e743462815812"
  },
  {
   "t": "2023-09-09T18:43:59Z",
   "sha": "7f1412b66129742e31b725f65988d03688959e6f"
  },
  {
   "t": "2023-09-09T18:47:12Z",
   "sha": "55ac4fd031de1dfef6f2ffa55ce22c0bbf16805a"
  },
  {
   "t": "2023-09-09T18:50:31Z",
   "sha": "8957db9fc23fdf60b263136ae4de5e4d7f32d0d0"
  },
  {
   "t": "2023-09-09T18:51:04Z",
   "sha": "5b8320109976ae106d8cb0a458e5f6988641f4c4"
  },
  {
   "t": "2023-09-09T18:52:57Z",
   "sha": "1744391695af6e0fec604a026680dc9ccda685a3"
  },
  {
   "t": "2023-09-09T19:53:37Z",
   "sha": "789212d1ab6cd2cd8c7ab9d187688b6bac3dfa63"
  },
  {
   "t": "2023-09-09T20:29:24Z",
   "sha": "53d72ae21b3516f5b11aa65cf503727aed6683d9"
  },
  {
   "t": "2023-09-09T20:32:59Z",
   "sha": "328e1aeca1c0ef04505f50137d07a63e511a3b30"
  },
  {
   "t": "2023-09-11T04:34:17Z",
   "sha": "a542e718147ab66a0df727367e4475fb2db71012"
  },
  {
   "t": "2023-09-11T04:41:24Z",
   "sha": "0e00c475292af903a4a74720e21d0a17bcf2a04f"
  },
  {
   "t": "2023-09-11T04:50:01Z",
   "sha": "504d11aca4342abef20e2d29b48fb34f50e9464d"
  },
  {
   "t": "2023-09-11T05:33:22Z",
   "sha": "a846a009da65455e37371b2021fe775762fae7b8"
  },
  {
   "t": "2023-09-11T07:23:55Z",
   "sha": "229564f1295f1e22903cac173160e5e3fecdc89d"
  },
  {
   "t": "2023-09-14T17:11:12Z",
   "sha": "d3dbe92719ef76586a8d93fad09c74bd795943c8"
  },
  {
   "t": "2023-09-17T07:48:59Z",
   "sha": "1bc880227f7c7b3fb0c12d4040e82da20e9a2fd3"
  },
  {
   "t": "2023-09-17T18:07:30Z",
   "sha": "57d54094cc453a22dedf806d0daa22277c54e307"
  },
  {
   "t": "2023-09-20T03:42:52Z",
   "sha": "5194b3a0a3d70cd72cba1c61ab8e645d22be27c8"
  },
  {
   "t": "2023-09-20T03:44:35Z",
   "sha": "57d54094cc453a22dedf806d0daa22277c54e307"
  },
  {
   "t": "2023-09-20T03:53:42Z",
   "sha": "5917bc4cc78bc59eba22bbc978e3538e7a1f1dfa"
  },
  {
   "t": "2023-09-20T04:46:14Z",
   "sha": "31876fc80d36ffe1e33605f5f092b4b22f61c3f4"
  },
  {
   "t": "2023-09-20T04:49:22Z",
   "sha": "14d2de222b74e3409589db35a655085f0f1a68fa"
  },
  {
   "t": "2023-09-24T00:53:41Z",
   "sha": "cef45f3cbfdf8b11d3733ae93125b6e5628e2ade"
  },
  {
   "t": "2023-09-24T01:00:41Z",
   "sha": "33f4e811d35859a30a3d1846aad9cf55d4289dc1"
  },
  {
   "t": "2023-09-24T02:34:51Z",
   "sha": "3f62321d80017030d5b60f251feb2a06304e8c63"
  },
  {
   "t": "2023-09-24T02:39:33Z",
   "sha": "6b9d73feaae51b0664203d2fcfbc95fc574a85b9"
  },
  {
   "t": "2023-09-24T04:52:15Z",
   "sha": "e2bbb797c9b86d6f639ef5a35a9167cc59c8b49d"
  },
  {
   "t": "2023-10-01T01:11:51Z",
   "sha": "000000050f3d6b4aeb2df0e0c0e6797fc37e74f9"
  },
  {
   "t": "2023-10-01T01:22:09Z",
   "sha": "0000000f484fd9772e1cc88a2c1aa60448838d15"
  },
  {
   "t": "2023-10-01T01:23:02Z",
   "sha": "f7d0b492ec48bb6667a790d6cf633b4034486c31"
  },
  {
   "t": "2023-10-01T01:23:45Z",
   "sha": "000000020b33a4e9a63b5b3c3f24530bd79a911f"
  },
  {
   "t": "2023-10-01T01:26:00Z",
   "sha": "0000000052d76352a647d8ca94b24a8835e12b5f"
  },
  {
   "t": "2023-10-01T01:31:10Z",
   "sha": "0000000aa7deb1e6cb5e567e11a8e348824d9904"
  },
  {
   "t": "2023-10-01T02:31:09Z",
   "sha": "ffffffffff604dfaec28cbf2fce0b6d0aab1c573"
  },
  {
   "t": "2023-10-01T02:43:26Z",
   "sha": "1234567950b88fb56cbe7965e36d4845d8912869"
  },
  {
   "t": "2023-10-01T02:55:57Z",
   "sha": "0000000aa7deb1e6cb5e567e11a8e348824d9904"
  },
  {
   "t": "2023-10-01T17:37:49Z",
   "sha": "0000000002f3b73fde8051d8deb9f16c9b28dfa7"
  },
  {
   "t": "2024-01-26T22:00:27Z",
   "sha": "010101019bbc8dafc3ecb93e9499f98067df8df2"
  },
  {
   "t": "2024-09-29T07:54:32Z",
   "sha": "5e354f11ae84fa33302368452cb8dacaca48c94a"
  },
  {
   "t": "2024-09-29T08:34:35Z",
   "sha": "fd02e7650f6410824a64f1403a98583b7ec6b0dd"
  },
  {
   "t": "2024-10-04T22:38:35Z",
   "sha": "d9c81fa04496656c37d150eefdb8b65302f5c618"
  },
  {
   "t": "2024-10-04T22:43:09Z",
   "sha": "a0d2f72e15b6e4842418897c3f7d2d75ab0fb55a"
  },
  {
   "t": "2024-10-04T22:45:14Z",
   "sha": "13538163c871e55177a35a1e9756597eb33714ff"
  },
  {
   "t": "2025-01-20T08:56:40Z",
   "sha": "70deb6737903556e2cf030d5a29106f01b43a574"
  },
  {
   "t": "2025-02-23T08:54:41Z",
   "sha": "1bed97a78432c0fbe024dce54e8615ce83ee19d8"
  },
  {
   "t": "2025-02-23T09:01:26Z",
   "sha": "a3b1733713459ac36a033ad2978488517930520a"
  },
  {
   "t": "2025-02-23T19:18:07Z",
   "sha": "f974d465d738090d7391e98ce2e5b0cdecba1376"
  },
  {
   "t": "2025-06-03T23:27:20Z",
   "sha": "b7de615dbc744d60082951da229feb229256cf2d"
  },
  {
   "t": "2025-06-03T23:28:15Z",
   "sha": "13447b21f973933830b305db5282aca8fc27e780"
  },
  {
   "t": "2025-06-04T02:52:56Z",
   "sha": "2f2470e844c79695df0140103c73d742371554cc"
  },
  {
   "t": "2025-11-02T05:51:03Z",
   "sha": "40d33af62bc5912f3e12d86376a7bcfbf7222dcd"
  },
  {
   "t": "2025-11-02T15:58:26Z",
   "sha": "f8513e38b369889df0b402f06d67fcf656495d53"
  },
  {
   "t": "2025-11-16T04:45:55Z",
   "sha": "526e7cc5e8bd464cd004931f36b7c98d08492d9e"
  },
  {
   "t": "2026-01-08T06:12:48Z",
   "sha": "4532e00e071c357ebcd1960d87628c67e7198adf"
  },
  {
   "t": "2026-01-08T06:17:59Z",
   "sha": "7a3a689f42d16a22c2b150098fa1a84be408cbe3"
  },
  {
   "t": "2026-01-08T06:19:22Z",
   "sha": "f108661214813339e25142d128e87ff026a2d1b2"
  },
  {
   "t": "2026-01-08T06:24:47Z",
   "sha": "9a994264d6637ed9be1fcfff6a9ad4fcd5778e3a"
  },
  {
   "t": "2026-01-08T06:26:32Z",
   "sha": "03716cc2e1fe9f03292f6c7281d079f67c9170f1"
  },
  {
   "t": "2026-01-08T06:27:16Z",
   "sha": "6bcaa46a7640196766922bc1435d96f17a5e751e"
  },
  {
   "t": "2026-01-08T08:31:41Z",
   "sha": "73e3246f4eb4c6874999660632a3672049a999f0"
  },
  {
   "t": "2026-01-08T08:36:34Z",
   "sha": "4232872dab3814afc0e5687fa4d7e7050ae9dfd3"
  },
  {
   "t": "2026-01-08T08:41:09Z",
   "sha": "0829d2d4d735c80abb56cb0e44426e496f33c53c"
  },
  {
   "t": "2026-01-08T08:49:30Z",
   "sha": "a9c3b1635346e5bd9f2b247b0ea322f25c921ecc"
  },
  {
   "t": "2026-01-08T08:50:16Z",
   "sha": "65676e5b8e63cf87d990aebce1be888955d14414"
  },
  {
   "t": "2026-01-08T08:52:00Z",
   "sha": "08a76c47a7f7f776df38f621697aa63503a28369"
  },
  {
   "t": "2026-01-08T09:35:01Z",
   "sha": "743530dab3841facfc0e577972c51df6777962f5"
  },
  {
   "t": "2026-01-08T09:35:28Z",
   "sha": "921a79c407261ee3f3154943920c8db66d7304d5"
  },
  {
   "t": "2026-01-08T09:53:16Z",
   "sha": "a3e6139a8d62b42a18b479b9538a8b2c54465dc1"
  },
  {
   "t": "2026-01-08T10:29:51Z",
   "sha": "40db0066bc3b8c79948b62f9597d0f629a1d660a"
  },
  {
   "t": "2026-01-08T10:35:18Z",
   "sha": "223a7092efb0e1b010f36b53c47917270672dc7b"
  },
  {
   "t": "2026-01-08T10:41:19Z",
   "sha": "42bddb2dc377a350b4b7ca2a4f4da2085346a8b0"
  },
  {
   "t": "2026-01-08T11:06:12Z",
   "sha": "d82dcb91c62245daa88a0d79ef544d0db65a6e08"
  },
  {
   "t": "2026-01-08T15:46:11Z",
   "sha": "c2d9fc732cc69eb7d5064f6a1db6dc4ac4523d43"
  },
  {
   "t": "2026-01-08T17:23:14Z",
   "sha": "cd3cd31f86799fa58ef3808a742f1be0c990cc76"
  },
  {
   "t": "2026-01-08T18:21:49Z",
   "sha": "6bc621ec037fa980bef10bd7049178eaa02a7c7e"
  },
  {
   "t": "2026-01-09T02:44:33Z",
   "sha": "20138f85cd1362f68960e2f94677b740fa1c12ec"
  },
  {
   "t": "2026-03-21T06:11:13Z",
   "sha": "776b62b1205f53564f447f471b2a3c24d2e4ef22"
  },
  {
   "t": "2026-03-21T06:12:38Z",
   "sha": "173eed98f3304761adb562f3bf9f6d4d4fb495bb"
  },
  {
   "t": "2026-03-21T06:13:30Z",
   "sha": "7fd3a77022ebf2f3af6bbeafe0e29663772f148f"
  },
  {
   "t": "2026-03-21T07:33:17Z",
   "sha": "fde1c3e75c9d8ef70ed761675cb3481b4a55607f"
  },
  {
   "t": "2026-03-21T07:49:09Z",
   "sha": "3944a3313fceb486df84936c7090f5a4499f5718"
  },
  {
   "t": "2026-03-21T08:13:14Z",
   "sha": "09434953b40def760cb2220548188bd85beec520"
  },
  {
   "t": "2026-03-21T14:17:29Z",
   "sha": "a46eef3c7daae0c52126f23e71e23ab4dd669106"
  },
  {
   "t": "2026-03-21T14:21:51Z",
   "sha": "77034cd32e0b7c2b1321e40b6f4df51fc04d38c7"
  },
  {
   "t": "2026-03-21T15:08:12Z",
   "sha": "473d501c786f849446bed49bb2f8e2bae46a26e1"
  },
  {
   "t": "2026-03-21T17:52:38Z",
   "sha": "41d82e57e1cc02d852830c9d219899bfabff1349"
  },
  {
   "t": "2026-03-22T01:06:22Z",
   "sha": "630316238d5fee27f5bc9e2c611937289c7791be"
  },
  {
   "t": "2026-03-22T14:52:36Z",
   "sha": "8021845dfd7549b720024ba356ffa1ddb9856630"
  },
  {
   "t": "2026-03-22T15:16:34Z",
   "sha": "b78373188ab88ab0a9049e62a85146d5516cb10e"
  },
  {
   "t": "2026-06-28T05:57:33Z",
   "sha": "b3bd890e91c84198ad5101c4ed3a92786ef90c6a"
  },
  {
   "t": "2026-08-25T05:41:24Z",
   "sha": "dc54682b083eb277a0cabee3a5bab6bce2dbaabe"
  },
  {
   "t": "2026-08-25T05:48:11Z",
   "sha": "82a932ea889f1a466ff3ccdce979386e5a15d0e2"
  },
  {
   "t": "2026-08-25T06:44:34Z",
   "sha": "1e01082aa602ed390df5c827a4960f823318e737"
  },
  {
   "t": "2026-08-25T06:52:01Z",
   "sha": "91b5c0024cc630e4e6c516b0b83529dbc4395c62"
  },
  {
   "t": "2026-08-25T07:07:14Z",
   "sha": "5f7fdc05f62c5ae40a995aaf8e2d4289658cec67"
  }
 ],
 "additions": 590,
 "deletions": 352,
 "changed_files": 11,
 "commit_count": 8,
 "size_bucket": "L",
 "mergeable_state": "dirty",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {
    "concept_ack": [
     {
      "login": "Sjors",
      "url": "https://github.com/bitcoin/bitcoin/pull/27260#pullrequestreview-1618676862"
     },
     {
      "login": "rkrux",
      "url": "https://github.com/bitcoin/bitcoin/pull/27260#pullrequestreview-2598102040"
     },
     {
      "login": "jonatack",
      "url": "https://github.com/bitcoin/bitcoin/pull/27260#pullrequestreview-2635042631"
     },
     {
      "login": "l0rinc",
      "url": "https://github.com/bitcoin/bitcoin/pull/27260#pullrequestreview-3027286087"
     }
    ],
    "approach_ack": [
     {
      "login": "RandyMcMillan",
      "url": "https://github.com/bitcoin/bitcoin/pull/27260#issuecomment-1741964735"
     }
    ]
   },
   "conflicts": [
    {
     "number": 36111,
     "title": "rpc: bound memory for overlong Bech32 errors",
     "author": "l0rinc"
    },
    {
     "number": 36087,
     "title": "util: Add and use AssertUnreachable",
     "author": "maflcko"
    },
    {
     "number": 36074,
     "title": "scripted-diff: [test] replace assert with Assert",
     "author": "maflcko"
    },
    {
     "number": 35301,
     "title": "Silent Payments: Implement bip352 (take 2)",
     "author": "Eunovo"
    }
   ]
  }
 },
 "acks_parsed": {
  "Sjors": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2023-09-09T18:03:42Z",
   "stale": false
  },
  "RandyMcMillan": {
   "kind": "approach_ack",
   "hash": null,
   "t": "2023-10-01T05:28:15Z",
   "stale": false
  },
  "jonatack": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2025-02-22T17:03:54Z",
   "stale": false
  },
  "l0rinc": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2025-07-17T05:39:02Z",
   "stale": false
  }
 },
 "acks_tally": {
  "ack": 0,
  "stale_ack": 0,
  "concept_ack": 3,
  "approach_ack": 1,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 0,
  "changes_requested": 3,
  "distinct_reviewers": [
   "RandyMcMillan",
   "Sjors",
   "achow101",
   "fanquake",
   "jonatack",
   "l0rinc",
   "luke-jr",
   "maflcko",
   "rkrux",
   "sedited"
  ]
 },
 "signals": {
  "needs_rebase": true,
  "ci_failed": false,
  "mergeable_state": "dirty",
  "last_author_activity": "2026-08-25T07:07:14Z",
  "last_reviewer_activity": "2026-08-25T06:24:34Z",
  "last_reviewer": "l0rinc",
  "author_silent_days": 23,
  "waiting_on_author_days": 0,
  "days_since_update": 18
 },
 "refs": {
  "mentioned": [
   26290,
   27727,
   27827,
   28201,
   28246
  ],
  "depends_on": [],
  "fixes": [
   26290
  ],
  "linked_issues": [
   {
    "number": 26290,
    "type": "issue",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "Improve the error message when an address cannot be parsed because it is for a different network "
   }
  ],
  "references": [
   {
    "number": 26290,
    "type": "issue",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "Improve the error message when an address cannot be parsed because it is for a different network "
   },
   {
    "number": 27727,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2023-05-24",
    "title": "rpc: Fix invalid bech32 address handling"
   },
   {
    "number": 27827,
    "type": "pull",
    "state": "closed",
    "merged": false,
    "merged_at": null,
    "title": "Silent Payments: send and receive"
   },
   {
    "number": 28201,
    "type": "pull",
    "state": "closed",
    "merged": false,
    "merged_at": null,
    "title": "Silent Payments: sending"
   },
   {
    "number": 28246,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2023-09-19",
    "title": "wallet: Use CTxDestination in CRecipient instead of just scriptPubKey"
   }
  ],
  "conflicts": [
   36111,
   36087,
   36074,
   35301
  ]
 },
 "stack": {
  "shares_commits_with": [],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [
  "src/bech32.cpp",
  "src/kernel/chainparams.cpp",
  "src/kernel/chainparams.h",
  "src/key_io.cpp",
  "src/test/base58_prefix_decoder_tests.cpp",
  "src/util/base58_address.cpp",
  "src/util/base58address.h",
  "src/util/chaintype.cpp",
  "src/util/chaintype.h",
  "test/functional/rpc_invalid_address_message.py",
  "test/functional/rpc_validateaddress.py"
 ],
 "body": "# Improve Address Decoding Error Messages\n\nFixes #26290.\n\n## Issue\n\n`DecodeDestination` gives misleading errors when a user inputs a valid address for the wrong network (e.g. a signet address while running on mainnet). Because the Bech32-vs-Base58 dispatch guessed the encoding from the address prefix, a valid Bech32 address for a different network fell through to the Base58 path and reported \"Invalid or unsupported Segwit (Bech32) or Base58 encoding.\"\n\n## Approach\n\n- **Decode first, then validate**: the input is decoded with `bech32::Decode()` upfront (on a lowercased copy, so mixed-case input can be diagnosed explicitly without decoding twice) instead of prefix-guessing. Valid Bech32 addresses for other networks now reach the HRP check and report the expected and actual prefix. Malformed input is diagnosed by the most specific applicable decoder.\n- **Separated helpers**: `DecodeDestination` is split into `DecodeBech32Destination()` / `DecodeBase58Destination()`; pure moves/refactors are in their own commits, separate from behavior changes.\n- **Structured Bech32 errors**: `bech32::LocateErrors()` now returns a `bech32::Error` code plus locations instead of a message string; `key_io` maps codes to user-facing messages via `Bech32ErrorMessage()`.\n- **Network-aware Base58 errors**: expected human-readable prefixes (e.g. \"1\", \"3\") come from a new `CChainParams::Base58PrefixText()` table populated for every network and `Base58Type`.\n\n## Error message changes\n\n| Scenario | Previous | New |\n|----------|----------|-----|\n| Bech32 address for another network | \"Invalid or unsupported Segwit (Bech32) or Base58 encoding.\" | \"Invalid or unsupported prefix for Segwit (Bech32) address (expected bc, got tb)\" |\n| Mixed-case Bech32 string | \"Invalid character or mixed case\" | \"Bech32 address is mixed case\" (with offending character positions) |\n| Bech32 checksum/format errors | bare message from `LocateErrors` | \"Bech32 address decoded with error: \u2026\" |\n| Base58 address with another network's version bytes | \"Invalid or unsupported Base58-encoded address.\" | \"Invalid Base58 address. Expected prefix 3 or 1\" |\n| Base58 checksum/length failure | \"Invalid or unsupported Segwit (Bech32) or Base58 encoding.\" | \"Invalid checksum or length of Base58 address (P2PKH or P2SH)\" |\n| Input that is neither | \"Invalid or unsupported Segwit (Bech32) or Base58 encoding.\" | \"Address is not valid Base58 or Bech32\" |\n\nConsistency: the trailing period was dropped from the wrong-network prefix message, and the witness program size error now says \"SegWit v0\" instead of \"Bech32 v0\" (the version is a SegWit concept, not an encoding one).\n\n## Tests\n\n- `test/functional/data/rpc_validateaddress.json`: new data file with test vectors keyed by network; `rpc_validateaddress.py` runs them on both signet and mainnet (restarting the node in between), re-enabling the `tb1` BIP 173/350 vectors that were commented out in #27727 and dropping duplicates.\n- `rpc_invalid_address_message.py` and `wallet_basic.py` updated for the new messages.\n- New `key_io` unit test checking `Base58PrefixText()` on all networks; `bech32` unit tests updated for the error-code enum.",
 "commits": [
  {
   "sha": "a73b675fc18a128b088f71b4722b6e1376e51dda",
   "date": "2026-08-25T07:04:54Z",
   "message": "chainparams: add human-readable base58 prefix data\n\nExpose the human-visible leading characters (e.g. \"1\", \"3\", \"xpub\") of\nbase58 strings via CChainParams::Base58PrefixText(), mirroring the raw-byte\nbase58Prefixes[] table already populated for every Base58Type.\n\nFollow-up commits consume this from DecodeDestination to build network-aware\nerror messages such as \"Invalid Base58 address. Expected prefix 3 or 1\".\nPopulating every role keeps the table symmetric with base58Prefixes[]."
  },
  {
   "sha": "e4bf30d8e8b83aec2e86a2457250bc1341603d0c",
   "date": "2026-08-25T07:04:55Z",
   "message": "bech32: return error code enum from LocateErrors\n\nLocateErrors previously returned a user-facing message string alongside\nthe error locations, forcing its callers to either display the string\nverbatim or inspect it (e.g. substring matching) to infer what went\nwrong.\n\nReturn a bech32::Error code instead and let the caller decide how to\npresent each error, via a new Bech32ErrorMessage() helper in key_io.cpp.\nNo behavior change: the produced messages are identical."
  },
  {
   "sha": "4f018df498c345eece2eccddd724f5dcba06c224",
   "date": "2026-08-25T07:04:56Z",
   "message": "refactor: split Bech32 and Base58 destination decoding into helpers\n\nDecodeDestination handled both encodings in a single intertwined\nfunction, gated by a negated double condition\n(!is_bech32 && DecodeBase58Check(...)).\n\nExtract the two handlers into DecodeBech32Destination() and\nDecodeBase58Destination(), and restructure the dispatch to start with\nthe non-negated is_bech32 condition. Pure move/restructure, no behavior\nchange."
  },
  {
   "sha": "f5ec9d53998b5b7923bd3b5b729ed2e4eec0c1c8",
   "date": "2026-08-25T07:04:57Z",
   "message": "key_io: decode Bech32 upfront, before attempting Base58\n\nDecodeDestination previously guessed the encoding from the address\nprefix: only strings whose (lowercased) leading characters matched the\ncurrent network's HRP were routed to the Bech32 decoder. A valid\nBech32 address for a different network (e.g. a tb1... address while\nrunning on mainnet) fell through to the Base58 path and produced the\nmisleading \"Invalid or unsupported Segwit (Bech32) or Base58\nencoding.\" error.\n\nDecode with bech32::Decode() upfront instead. Valid Bech32 addresses\nfor other networks now reach the existing HRP check and report the\nexpected and actual prefix. Malformed input is diagnosed by the most\nspecific applicable decoder: unless the input already rules out Bech32\n(invalid character or mixed case), report the specific Bech32 error and\nits locations, while strings that still raw-decode as Base58 report a\nBase58 checksum/length error. In particular, strings beyond the\n90-character BIP173 limit (e.g. an extended key) cannot be Bech32\naddresses, so those are diagnosed as Base58 as before."
  },
  {
   "sha": "ff52dc11d12ea0fa3ce63d76a10957d6cb5e887e",
   "date": "2026-08-25T07:04:58Z",
   "message": "key_io: report mixed-case Bech32 addresses explicitly\n\nA mixed-case Bech32 string is invalid even when its lowercased form\nwould decode fine. Detect this up front by decoding a lowercased copy\nof the input (also used for the actual decoding, so no extra decode is\nperformed) and report \"Bech32 address is mixed case\" with the\noffending character positions, instead of the generic\n\"Invalid character or mixed case\" error."
  },
  {
   "sha": "3ada26fcb68cd3548106c9bbc6338308fde6dcf0",
   "date": "2026-08-25T07:04:58Z",
   "message": "key_io: clarify address decoding error messages\n\n- Prefix Bech32 decoding failures with \"Bech32 address decoded with\n  error: ...\" so it is clear which decoder produced the error.\n- Report \"Address is not valid Base58 or Bech32\" when the characters\n  already rule out Bech32 and the input does not raw-decode as Base58\n  either.\n- Drop the inconsistent trailing period from the wrong-network prefix\n  message.\n- Say \"SegWit v0\" instead of \"Bech32 v0\" in the witness program size\n  error; the version is a SegWit concept, not an encoding one."
  },
  {
   "sha": "e1bc3a928f788e473ae4a6a81f72f7d26fa7cbb1",
   "date": "2026-08-25T07:04:59Z",
   "message": "key_io: list expected prefixes in Base58 wrong-prefix errors\n\nA Base58 address that checksums correctly but carries another\nnetwork's version bytes (e.g. a mainnet 1... address on signet)\npreviously reported \"Invalid or unsupported Base58-encoded address.\",\ngiving no hint about what went wrong.\n\nReport the expected human-readable prefixes from the new\nCChainParams::Base58PrefixText() table instead, e.g.\n\"Invalid Base58 address. Expected prefix 2, m or n\"."
  },
  {
   "sha": "5f7fdc05f62c5ae40a995aaf8e2d4289658cec67",
   "date": "2026-08-25T07:06:46Z",
   "message": "test: data-drive rpc_validateaddress and cover signet\n\nMove the validateaddress test vectors into\ntest/functional/data/rpc_validateaddress.json, keyed by network, and\nrun them on both signet and mainnet (restarting the node in between).\n\nThis lets the tb1-prefixed BIP 173/350 vectors exercise their actual\ndefects (padding, wrong checksum encoding) on signet, where \"tb\" is\nthe expected HRP; on mainnet they now report the wrong-network prefix\nerror. The commented-out valid tb1 vectors (disabled in #27727) are\nre-enabled on signet, and duplicate entries are dropped."
  }
 ],
 "timeline": [
  {
   "t": "2023-03-15T10:53:03Z",
   "kind": "review_comment",
   "who": "fanquake",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_invalid_address_message.py",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": null,
   "text": "Not sure why this is being removed"
  },
  {
   "t": "2023-03-15T10:54:01Z",
   "kind": "comment",
   "who": "fanquake",
   "assoc": "MEMBER",
   "text": "Please keep your changes, and \"fixes\" commits squashed. Looks like your changing the file perms on at least one file, is that intentional?"
  },
  {
   "t": "2023-03-15T10:58:04Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "test/functional/rpc_invalid_address_message.py",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1136867843,
   "text": "This was removed because the linter was throwing on the file permissions and that was the suggestion. I never deliberately changed any perms or ran anything as sudo.\n\nEdit: I know exactly what happened. This will be resolved.\nEdit 2: This has been resolved a result of a scp command from one host to another."
  },
  {
   "t": "2023-03-15T11:07:49Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "d9654cf211db24080592834b61c0de0f9bf6a8c9"
  },
  {
   "t": "2023-03-15T11:14:21Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nWill do. No it was not intentional but was a side effect of moving 3 files over scp to a different host. This has been resolved and commits squashed."
  },
  {
   "t": "2023-03-15T11:36:02Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "0f1b1dcd130eed9837bd8e8ca4f3e851fe62abcb"
  },
  {
   "t": "2023-03-15T11:45:40Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "fbf9f6bb876f2e7bbfe2c6315a9e4a8da504e27e"
  },
  {
   "t": "2023-03-15T11:54:38Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "269f08044580d128c13f7981e3bbf9e3235e3a60"
  },
  {
   "t": "2023-03-15T12:16:05Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "edff3dc42601e097fbbef1f073d71e0d5201c996"
  },
  {
   "t": "2023-03-15T23:57:57Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "770591b052076b13440706d60d363e8aee686bc8"
  },
  {
   "t": "2023-03-16T00:04:37Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "c98f7cc7cf65321116ff437cd4b3a297cd396e47"
  },
  {
   "t": "2023-03-16T00:10:00Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "911c8b60c6336322e7a6c24f035b1f6f2e23ae51"
  },
  {
   "t": "2023-03-18T05:02:31Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "30fc8d5d2e6549cebf5962d85102b2a5bbe5f653"
  },
  {
   "t": "2023-03-19T08:07:23Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "c30cfb3f8bef6ad18e9fd439fe1d0ad773a31d23"
  },
  {
   "t": "2023-03-19T08:09:30Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "b0d7527c2e76ed1d43c67bd1964e99733989a163"
  },
  {
   "t": "2023-03-19T08:10:58Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "5039dd235cee3c3e73cf3d23f638e77302cea49f"
  },
  {
   "t": "2023-03-19T08:14:06Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "3c0fcda0fc958e455f21d37af359a0c67350d8a4"
  },
  {
   "t": "2023-03-19T08:50:42Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "aff763576a433c64a951c9b0e64741665d1d34ba"
  },
  {
   "t": "2023-05-18T14:19:53Z",
   "kind": "comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "text": "Needs rebase on current master, if still relevant"
  },
  {
   "t": "2023-05-18T20:10:45Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "d6177846475268064b59548dd2f0ecec5826e75e"
  },
  {
   "t": "2023-05-19T03:09:01Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "5ff24900695bc6ecf7b99335d5a20aee477fde37"
  },
  {
   "t": "2023-05-19T06:21:45Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nI believe this PR is still very relevant because it substantially improves the logic around address decoding and specifically the displaying of errors in the GUI and RPC. With that said I have rebased and this code is passing all tests other than `Win64 native [vs2022]` which seems to be failing for the majority of PRs that are on master due to warnings."
  },
  {
   "t": "2023-05-19T06:25:04Z",
   "kind": "comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "text": "Thanks, the reason I mentioned it was the silent merge conflict: `key_io.cpp:152:48: error: \u2018const class CChainParams\u2019 has no member named \u2018NetworkIDString\u2019`, which is now fixed"
  },
  {
   "t": "2023-05-19T06:30:10Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nIs there a good way to detect these silent conflicts earlier? Usually I get notified via email when there are issues that need rebased; this is the first time one has happened without a notification.\n\nThanks"
  },
  {
   "t": "2023-05-19T23:07:23Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "56908f19b88213d34c422a09e4f6b685d24138a2"
  },
  {
   "t": "2023-06-22T21:09:54Z",
   "kind": "review_comment",
   "who": "luke-jr",
   "assoc": "CONTRIBUTOR",
   "path": "src/key_io.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": null,
   "text": "The prefix does not necessarily indicate a chain. The current error is more correct."
  },
  {
   "t": "2023-06-22T21:10:47Z",
   "kind": "review_comment",
   "who": "luke-jr",
   "assoc": "CONTRIBUTOR",
   "path": "src/key_io.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": null,
   "text": "Bitcoin shouldn't be called \"mainnet\" in user-facing errors."
  },
  {
   "t": "2023-06-22T21:12:08Z",
   "kind": "review_comment",
   "who": "luke-jr",
   "assoc": "CONTRIBUTOR",
   "path": "src/key_io.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": null,
   "text": "Feels kind of ugly to hard-code the prefixes here."
  },
  {
   "t": "2023-06-22T21:12:11Z",
   "kind": "review",
   "who": "luke-jr",
   "assoc": "CONTRIBUTOR",
   "state": "CHANGES_REQUESTED",
   "commit": "b7e27c61abcfc98032beb5372b2770fb9b17a7ce",
   "text": ""
  },
  {
   "t": "2023-06-23T02:33:21Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "603e8dedf50b8a4a15a8849cdb9a84286d9a7675"
  },
  {
   "t": "2023-06-23T02:39:19Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "56908f19b88213d34c422a09e4f6b685d24138a2"
  },
  {
   "t": "2023-06-23T02:41:32Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "c6e9f046dd766a18b0a42f4a6332d99da3408c8a"
  },
  {
   "t": "2023-06-23T02:49:44Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "4a577341c8ad61bc262ceea1fd1f042b71a5f0ea"
  },
  {
   "t": "2023-06-23T08:31:39Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/key_io.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1239034595,
   "text": "This has been resolved by adding a function to chaintype.cpp called ChainTypeToDisplayString. This decodes the ChainType Enum into user-facing strings. Including using 'Bitcoin' to reference mainnet\n\nImpoper chain errors are now displayed  for example\n```\"error\": \"Invalid chain prefix for Bitcoin. Expected bc got tb\"```"
  },
  {
   "t": "2023-06-23T08:33:39Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/key_io.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1239033958,
   "text": "This has been resolved by rewording the error message since you are correct addresses have prefixes not chains.\n\n```Invalid prefix for regtest address (expected bcrt, got bc)```"
  },
  {
   "t": "2023-07-09T19:43:17Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "0e6c2f88177f22e7509aab3fbaec2786a7a49ce1"
  },
  {
   "t": "2023-07-09T20:12:55Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "335ad790a02197069357223bfa79c4b509f09d9b"
  },
  {
   "t": "2023-07-10T04:29:22Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "8f2e548f6276386c27a60336cf12665d5e316fb7"
  },
  {
   "t": "2023-07-10T06:55:28Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/key_io.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1239035489,
   "text": "8f2e548f6276386c27a60336cf12665d5e316fb7 solves this via the addition of a function to deterministically calculate the range set of  encoded base58 prefixes that result from a version byte(s). The requirements are the length of bytes that are encoded and the desired prefix bytes as a vector.\n\nAs a side note thanks for suggesting this as a review item, it was quite a fun problem to think about and implement a solution for.\n\nhttps://github.com/bitcoin/bitcoin/blob/8f2e548f6276386c27a60336cf12665d5e316fb7/src/util/base58address.cpp#L10"
  },
  {
   "t": "2023-07-10T07:15:06Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "This PR has had some substantial updates applied since it's first inception.\n\n1. Deterministically calculated base58 prefixes with the function ```EncodedPrefixesFromBase58Prefix```\n\n3. This PR now greatly improves the accuracy of error reporting as seen in the updates to 3d0a5c37e9ccedfa4ecfaa48eeeca1ada5b4eec1 where many valid bech32 tests are fed through the base58 section of the `DecodeDestination` function. This line gives a great example of how this PR addresses this from the current\nhttps://github.com/bitcoin/bitcoin/blob/79e8247ddb166f9b980f40249b7372a502402a4d/test/functional/rpc_validateaddress.py#L11-L17 Into a much more accurate representaion.\nhttps://github.com/bitcoin/bitcoin/blob/8f2e548f6276386c27a60336cf12665d5e316fb7/test/functional/rpc_validateaddress.py#L11-L17 This follows up even further to the changes made in https://github.com/bitcoin/bitcoin/pull/27727\n\n4. A function `ChainTypeToDisplayString(ChainType chain)` has been added to give user facing display names for the various chains a Bitcoin client can attach themselves to.\nhttps://github.com/bitcoin/bitcoin/blob/8f2e548f6276386c27a60336cf12665d5e316fb7/src/util/chaintype.cpp#L11-L23\n\nAs a note this PR solves a fundamental issue in the current address validation scheme that if a user inputs anything bech32 with the wrong hrp it's immediately treated as base58 even though it is valid bech32."
  },
  {
   "t": "2023-07-15T08:14:38Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "845fa6fc2f9de842b510ac57c8d52a8487600063"
  },
  {
   "t": "2023-07-15T08:29:00Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "ed855375784396175995f72fef723ac088f2ab5f"
  },
  {
   "t": "2023-07-15T09:10:09Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "8a1c62d33ba1bbd064e9b6fcb556c9097140fb58"
  },
  {
   "t": "2023-07-15T09:16:26Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "5d7d1c09d50c46bc1b3dce99db599f6cdb234860"
  },
  {
   "t": "2023-07-15T09:22:22Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "81b9c3acf19525eb22f18fe019c47a1e379d5fdc"
  },
  {
   "t": "2023-07-15T09:34:56Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "1a358ee99b20534c396e555b91459dd72ab431d4"
  },
  {
   "t": "2023-07-15T09:44:51Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "aac6db2b1e843539758162fb43bdbeeb911a33e4"
  },
  {
   "t": "2023-07-15T09:58:32Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "5a5e8dccea60baf8f9cbeaff1e72cc25f9339521"
  },
  {
   "t": "2023-07-22T08:14:09Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "a1ef5ebdf1b93d7baace42e0ee6e9626ab28f58d"
  },
  {
   "t": "2023-07-22T08:17:57Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "991061487352cf6b10de00b7fad5042121da87ec"
  },
  {
   "t": "2023-07-23T05:46:46Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "90fc3d8d98635b04269b49cbf4ca8db65a4fe124"
  },
  {
   "t": "2023-07-23T06:16:33Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "4cf388dceea8b49511c7f569a60f6cd87aae8f05"
  },
  {
   "t": "2023-07-23T06:33:26Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "5db8d67d88575f1fc481564a6bb8ba0f0f3579d5"
  },
  {
   "t": "2023-07-23T06:36:50Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "c36a17b87cca5529191d814b282831a5aab2ab4f"
  },
  {
   "t": "2023-07-25T11:04:48Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "035689d2462ff1f71343ba45a760ceb97850bb4a"
  },
  {
   "t": "2023-07-25T11:10:23Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "fc8d67628374ecd4e36f162735a3b40877d0cea4"
  },
  {
   "t": "2023-07-25T11:12:35Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "cda72da0ec792900b3957fff21060bf2555c309b"
  },
  {
   "t": "2023-07-25T20:10:04Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "b0623b26de89384e0f3aa485227414fa842de89a"
  },
  {
   "t": "2023-07-25T20:12:57Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "bf45422b1ffa9ed9935a79ef4ec6700f02380b2a"
  },
  {
   "t": "2023-07-25T20:17:19Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "013072685c10c6dc2c12099fddea93459f567698"
  },
  {
   "t": "2023-07-25T20:41:01Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "658d77d642a027f0a523529339f2f663b7d8b1a5"
  },
  {
   "t": "2023-07-27T20:01:49Z",
   "kind": "review_comment",
   "who": "luke-jr",
   "assoc": "CONTRIBUTOR",
   "path": "src/key_io.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1239033958,
   "text": "Could just as well still be unsupported,  not invalid."
  },
  {
   "t": "2023-07-28T07:04:02Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "b66e974ac8f21971602051c08df830d14cf3df7e"
  },
  {
   "t": "2023-07-28T07:13:02Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/key_io.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1239033958,
   "text": "I have changed this to read ```Invalid or unsupported prefix```... testing my own knowledge; The reason you can have an unsupported but still technically valid address would be in the event of a softfork to a new SegWit version? e.x. _a segwit client interpreting a taproot address would say \"invalid\"_ but that is not completely true because the address is valid. Just not supported by the client?\n\nThis has been resolved in b66e974ac8f21971602051c08df830d14cf3df7e"
  },
  {
   "t": "2023-09-06T19:38:54Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "8ba7483c18a8ba0799d246658cb4267c7a87f7bf"
  },
  {
   "t": "2023-09-06T21:55:44Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "5dbe9dc1a56d5505bee751fa63a0ac1d983a4a7c"
  },
  {
   "t": "2023-09-07T14:52:55Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "src/util/base58address.h",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": null,
   "text": "89139d6b51a544d041a2783526c4744eeca7bc0f: nit, I prefer adding an underscore for new files, i.e. `base58_address.h`, but I don't think there's a rule for that."
  },
  {
   "t": "2023-09-07T14:56:47Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "src/util/base58address.h",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": null,
   "text": "89139d6b51a544d041a2783526c4744eeca7bc0f: can you add a Doxygen comment here? See e.g. [here](https://github.com/bitcoin/bitcoin/blob/b097a689ed4cdc9fb3e6fb08d22a25a73f5552b3/src/script/descriptor.h#L48-L54) for inspiration.\n\nAlso I assume this returns 1 prefix, so maybe call it `Base58PrefixFromVersionBytes`. Without reading the implementation I'm confused, because the function name suggests `base58Prefix` is an output, but the parameter suggests it's an input."
  },
  {
   "t": "2023-09-07T15:00:42Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "src/kernel/chainparams.h",
   "commit": "526e7cc5e8bd464cd004931f36b7c98d08492d9e",
   "in_reply_to": null,
   "text": "fa0ed7796fb9553c0458c7bc534f73441a991b0d: nit, don't touch unrelated things (may need to adjust your editor to not automatically do that)."
  },
  {
   "t": "2023-09-07T15:05:14Z",
   "kind": "review",
   "who": "Sjors",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "5dbe9dc1a56d5505bee751fa63a0ac1d983a4a7c",
   "text": "Thanks for splitting this up into multiple commits.\n\nI left some brief comments that would make review easier, but haven't done a good review yet.\n\nCan you add a test for `Base58PrefixesFromVersionBytes`?"
  },
  {
   "t": "2023-09-07T15:07:55Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "src/key_io.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1239033958,
   "text": "Doesn't even have to be a soft fork. E.g. a silent payment address (#27827) has a prefix we don't support (yet), but it's not a soft fork. It's also not a different network."
  },
  {
   "t": "2023-09-07T16:50:41Z",
   "kind": "comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "text": "You may also want to check if #28246 gets in the way of anything you're doing here."
  },
  {
   "t": "2023-09-08T03:47:36Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "0b5f317156d6b806ebf7e4db2c756645569af364"
  },
  {
   "t": "2023-09-08T04:26:30Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "d6d9c5cf05e019ea3ab9a145965517e05c8e19bd"
  },
  {
   "t": "2023-09-08T16:41:50Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "14b8205f6360cf4e35a958e8a96a7d657afaf8ce"
  },
  {
   "t": "2023-09-08T16:47:00Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "700967063fab712d2acf982f77ebc9b70ff49aa6"
  },
  {
   "t": "2023-09-08T17:08:00Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "dcb2d2b2c7805cdf5e9ec65c6aeb77b399b676f9"
  },
  {
   "t": "2023-09-09T05:09:05Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "303308e3fcf4ba6b5e10fc516bdf591415f80d99"
  },
  {
   "t": "2023-09-09T05:18:45Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/util/base58address.h",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1318741154,
   "text": "This returns all possible address prefixes given a version byte .\n\nExample: A testnet address uses a version byte of 0x6F prepended to 24 bytes of of data. That data when base58 encoded will generate 2 possible prefixes ```['m','n']```\n\nI have created unit tests that should show and demonstrate how this function works.\n\nhttps://github.com/bitcoin/bitcoin/blob/303308e3fcf4ba6b5e10fc516bdf591415f80d99/src/test/base58_prefix_decoder_tests.cpp#L13-L31"
  },
  {
   "t": "2023-09-09T05:26:27Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/kernel/chainparams.h",
   "commit": "526e7cc5e8bd464cd004931f36b7c98d08492d9e",
   "in_reply_to": 1318746384,
   "text": "This was deliberate. The rest of the file has comments in the form of ```/** Alice Bob Carol */``` and this line didn't since I was working in the area I decided to make it consistent with the rest of the file."
  },
  {
   "t": "2023-09-09T05:54:54Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "d75fe6bda6df4ca31e9cafa645d7b98e87251bce"
  },
  {
   "t": "2023-09-09T06:15:32Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "6fc553aa40bea8038b973ba3a088f159957085ba"
  },
  {
   "t": "2023-09-09T06:21:40Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nThere is a case in #28246 DecodeDestination that is modified, but this pr does not modify any logic that is being replaced. As such should not be a problem."
  },
  {
   "t": "2023-09-09T06:28:43Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "c4580d02810edddf7f0521d8f86d537fe280834d"
  },
  {
   "t": "2023-09-09T06:33:13Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "6fc553aa40bea8038b973ba3a088f159957085ba"
  },
  {
   "t": "2023-09-09T06:38:19Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "f1a6574d51ea753cfe8f0aa0c1d5b13cd73ad5a0"
  },
  {
   "t": "2023-09-09T06:51:06Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "fdd43caeaea61e5eb52119a69dfe338085422703"
  },
  {
   "t": "2023-09-09T06:59:26Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "8c2f7a10cf256c4f1d39496f421cbb24d45f4bef"
  },
  {
   "t": "2023-09-09T07:05:05Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "8b7a94cc908238a45fa26d2f355d2c9c60fba2d4"
  },
  {
   "t": "2023-09-09T07:12:19Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nI have added unit tests for Base58PrefixesFromVersionByte. Coverage includes all mainnet and testnet address types. And the the longest continuous segment of unchanging outputs."
  },
  {
   "t": "2023-09-09T14:11:26Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "7477465b539a449749ce1b02d81462d0d0fc3bcb"
  },
  {
   "t": "2023-09-09T14:12:40Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/util/base58address.h",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1318735685,
   "text": "Completed in 7458d034917fa0bfe060a24731b6f22cc2c6db9e"
  },
  {
   "t": "2023-09-09T14:21:00Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "2de9dbefcf6d5e498cf8034834444eedfe051b54"
  },
  {
   "t": "2023-09-09T15:18:27Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "c6bf28ff4f126e7c3c4814397ffbac147951eecf"
  },
  {
   "t": "2023-09-09T15:21:40Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "02f442d615783b3541faf2f5dab99df58744a86d"
  },
  {
   "t": "2023-09-09T15:30:07Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "7397518101fc0f8f56afe41b2d7b9f44946ebb70"
  },
  {
   "t": "2023-09-09T17:47:38Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "src/bech32.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": null,
   "text": "e6e22bc9c838be127bbedc8fdeb3c9a40f6e3513: could add a comment about what this is doing (it confused me initially):\n\n```cpp\n// Mark all error_locations >= BECH32_MAX_LENGTH\n// (and ignore all potential errors in earlier positions).\n```"
  },
  {
   "t": "2023-09-09T17:54:34Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "src/test/base58_prefix_decoder_tests.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": null,
   "text": "8fea6d07a1bd7b6ad5684da7328443954395023f: nit: could move this out of the loop since it doesn't depend on `version_byte`"
  },
  {
   "t": "2023-09-09T17:56:32Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "src/test/base58_prefix_decoder_tests.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": null,
   "text": "8fea6d07a1bd7b6ad5684da7328443954395023f: this is duplicate with the above test?"
  },
  {
   "t": "2023-09-09T18:01:29Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_invalid_address_message.py",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": null,
   "text": "7397518101fc0f8f56afe41b2d7b9f44946ebb70: did you mean to disable these tests?"
  },
  {
   "t": "2023-09-09T18:03:42Z",
   "kind": "review",
   "who": "Sjors",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "7397518101fc0f8f56afe41b2d7b9f44946ebb70",
   "text": "Concept ACK\n\nCommit e6e22bc9c838be127bbedc8fdeb3c9a40f6e3513 looks good to me. Only lightly inspected the other commits.\n\nAlso compiled and ran the full test suite for each commit (ending in 7397518101fc0f8f56afe41b2d7b9f44946ebb70)."
  },
  {
   "t": "2023-09-09T18:41:48Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "62aa7f6d237e472b2df6defb4c6e743462815812"
  },
  {
   "t": "2023-09-09T18:43:59Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "7f1412b66129742e31b725f65988d03688959e6f"
  },
  {
   "t": "2023-09-09T18:47:12Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "55ac4fd031de1dfef6f2ffa55ce22c0bbf16805a"
  },
  {
   "t": "2023-09-09T18:50:31Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "8957db9fc23fdf60b263136ae4de5e4d7f32d0d0"
  },
  {
   "t": "2023-09-09T18:51:04Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "5b8320109976ae106d8cb0a458e5f6988641f4c4"
  },
  {
   "t": "2023-09-09T18:52:57Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "1744391695af6e0fec604a026680dc9ccda685a3"
  },
  {
   "t": "2023-09-09T18:54:20Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/test/base58_prefix_decoder_tests.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1320618336,
   "text": "You are correct, this has been moved to a single call before tests. Nice catch."
  },
  {
   "t": "2023-09-09T19:43:06Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/test/base58_prefix_decoder_tests.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1320618732,
   "text": "This test is different since it tests the largest range of same outputs.\n\nYou can view the expected outputs at https://en.bitcoin.it/wiki/List_of_address_prefixes, The second table gives the expected results. The number 145-255 should always have a base 58 prefix of ['2'] for a 25 byte encoded length."
  },
  {
   "t": "2023-09-09T19:53:37Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "789212d1ab6cd2cd8c7ab9d187688b6bac3dfa63"
  },
  {
   "t": "2023-09-09T19:55:08Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "test/functional/rpc_invalid_address_message.py",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1320619589,
   "text": "This was an artifact and has been resolved."
  },
  {
   "t": "2023-09-09T20:29:24Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "53d72ae21b3516f5b11aa65cf503727aed6683d9"
  },
  {
   "t": "2023-09-09T20:30:21Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/bech32.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1320617102,
   "text": "add in dbe6130764b85c8eb298ba3d236d1507dc930c5d"
  },
  {
   "t": "2023-09-09T20:32:59Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "328e1aeca1c0ef04505f50137d07a63e511a3b30"
  },
  {
   "t": "2023-09-11T04:34:17Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "a542e718147ab66a0df727367e4475fb2db71012"
  },
  {
   "t": "2023-09-11T04:41:24Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "0e00c475292af903a4a74720e21d0a17bcf2a04f"
  },
  {
   "t": "2023-09-11T04:50:01Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "504d11aca4342abef20e2d29b48fb34f50e9464d"
  },
  {
   "t": "2023-09-11T05:33:22Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "a846a009da65455e37371b2021fe775762fae7b8"
  },
  {
   "t": "2023-09-11T07:17:15Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/test/base58_prefix_decoder_tests.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1320618732,
   "text": "An additional bonus I just pushed is 100% coverage for the space of 25 byte Base58 strings. 4192ab5fb8e67cde3e31ee54718ec83b2ee1511b"
  },
  {
   "t": "2023-09-11T07:23:55Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "229564f1295f1e22903cac173160e5e3fecdc89d"
  },
  {
   "t": "2023-09-14T17:11:12Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "d3dbe92719ef76586a8d93fad09c74bd795943c8"
  },
  {
   "t": "2023-09-17T07:48:59Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "1bc880227f7c7b3fb0c12d4040e82da20e9a2fd3"
  },
  {
   "t": "2023-09-17T18:07:30Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "57d54094cc453a22dedf806d0daa22277c54e307"
  },
  {
   "t": "2023-09-20T03:42:52Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "5194b3a0a3d70cd72cba1c61ab8e645d22be27c8"
  },
  {
   "t": "2023-09-20T03:44:35Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "57d54094cc453a22dedf806d0daa22277c54e307"
  },
  {
   "t": "2023-09-20T03:53:42Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "5917bc4cc78bc59eba22bbc978e3538e7a1f1dfa"
  },
  {
   "t": "2023-09-20T04:46:14Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "31876fc80d36ffe1e33605f5f092b4b22f61c3f4"
  },
  {
   "t": "2023-09-20T04:49:22Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "14d2de222b74e3409589db35a655085f0f1a68fa"
  },
  {
   "t": "2023-09-24T00:53:41Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "cef45f3cbfdf8b11d3733ae93125b6e5628e2ade"
  },
  {
   "t": "2023-09-24T01:00:41Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "33f4e811d35859a30a3d1846aad9cf55d4289dc1"
  },
  {
   "t": "2023-09-24T02:34:51Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "3f62321d80017030d5b60f251feb2a06304e8c63"
  },
  {
   "t": "2023-09-24T02:39:33Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "6b9d73feaae51b0664203d2fcfbc95fc574a85b9"
  },
  {
   "t": "2023-09-24T04:52:15Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "e2bbb797c9b86d6f639ef5a35a9167cc59c8b49d"
  },
  {
   "t": "2023-10-01T01:11:51Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "000000050f3d6b4aeb2df0e0c0e6797fc37e74f9"
  },
  {
   "t": "2023-10-01T01:22:09Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "0000000f484fd9772e1cc88a2c1aa60448838d15"
  },
  {
   "t": "2023-10-01T01:23:02Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "f7d0b492ec48bb6667a790d6cf633b4034486c31"
  },
  {
   "t": "2023-10-01T01:23:45Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "000000020b33a4e9a63b5b3c3f24530bd79a911f"
  },
  {
   "t": "2023-10-01T01:26:00Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "0000000052d76352a647d8ca94b24a8835e12b5f"
  },
  {
   "t": "2023-10-01T01:31:10Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "0000000aa7deb1e6cb5e567e11a8e348824d9904"
  },
  {
   "t": "2023-10-01T02:31:09Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "ffffffffff604dfaec28cbf2fce0b6d0aab1c573"
  },
  {
   "t": "2023-10-01T02:43:26Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "1234567950b88fb56cbe7965e36d4845d8912869"
  },
  {
   "t": "2023-10-01T02:55:57Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "0000000aa7deb1e6cb5e567e11a8e348824d9904"
  },
  {
   "t": "2023-10-01T05:28:15Z",
   "kind": "comment",
   "who": "RandyMcMillan",
   "assoc": "CONTRIBUTOR",
   "text": "Approach ACK"
  },
  {
   "t": "2023-10-01T17:37:49Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "0000000002f3b73fde8051d8deb9f16c9b28dfa7"
  },
  {
   "t": "2024-01-26T22:00:27Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "010101019bbc8dafc3ecb93e9499f98067df8df2"
  },
  {
   "t": "2024-04-15T21:45:20Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "src/bech32.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": null,
   "text": "In 000000000c5fad4aca360a6e914c7779167838db \"Add bech32 error short & multiple separators cases\"\n\nThis is incorrect. `1` is an allowed character in the human readable part, hence a multiple separators check doesn't make sense. The real separator is simply the last `1` that appears. See https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki#bech32"
  },
  {
   "t": "2024-04-16T18:10:32Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "src/util/base58_address.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": null,
   "text": "In 000000000fbad5312fe6975959b0ab9ca5daeb16 \"Add Base58 Address Prefix Decoder\"\n\nIt seems a bit odd to me to do all of this work to compute these prefixes just for error messaging. ISTM it would be a lot simpler to just hard code them into chainparams anyways. It's not as if the prefixes will ever change, and new ones are unlikely to be added.\n\nMerging this code seems like an additional maintenance burden for very little gain.\n\nAlso, if you insist on keeping this code, it should be placed into its final location when introduced instead of moved in the last commit."
  },
  {
   "t": "2024-04-16T19:14:51Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/util/base58_address.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1567767610,
   "text": "https://github.com/bitcoin/bitcoin/pull/27260#discussion_r1239035489\n\nThe choice to do this was a response to the above comment. I would agree chainparams would be the place to implement a hardcoded (char[], stringview) prefix. Another advantage is that lookup is likely faster; so if a user is frequently getting errors it may save a few them a few cycles."
  },
  {
   "t": "2024-06-25T15:46:51Z",
   "kind": "comment",
   "who": "fanquake",
   "assoc": "MEMBER",
   "text": "Moved to draft for now, given at least one outstanding review comment and needs a rebase."
  },
  {
   "t": "2024-06-25T21:13:17Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nSorry for the delay in addressing these changes. Currently my work schedule has completely overran my spare time.\n\nI will carve out some time this week to rebase and refactor based on the review items.\n\nThanks"
  },
  {
   "t": "2024-09-26T06:57:50Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nWill close if I don't get to it by this weekend, sorry for my delays. Would like to make one last run at this.\n\nEdit: I have updates that will be pushed in a bit."
  },
  {
   "t": "2024-09-29T07:54:32Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "5e354f11ae84fa33302368452cb8dacaca48c94a"
  },
  {
   "t": "2024-09-29T08:34:35Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "fd02e7650f6410824a64f1403a98583b7ec6b0dd"
  },
  {
   "t": "2024-09-29T08:37:15Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\n```\n[07:54:50.521] + docker run --rm docker.io/amd64/ubuntu:24.04 bash -c 'env | grep --extended-regexp '\\''^(HOME|PATH|USER)='\\'''\n[07:54:50.522] + tee --append /tmp/env-ci_worker_1726594866_672026932-ci_i686_multiprocess\n[07:54:50.522] Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.\n[07:54:50.548] time=\"2024-09-29T07:54:50Z\" level=warning msg=\"RunRoot is pointing to a path (/run/user/1003/containers) which is not writable. Most likely podman will fail.\"\n[07:54:50.549] Error: creating tmpdir: mkdir /run/user/1003: permission denied\n[07:54:50.551] + echo 'Creating docker.io/amd64/ubuntu:24.04 container to run in'\n[07:54:50.551] Creating docker.io/amd64/ubuntu:24.04 container to run in\n[07:54:50.551] + DOCKER_BUILDKIT=1\n[07:54:50.551] + docker build --file /tmp/cirrus-build/ci/test_imagefile --build-arg CI_IMAGE_NAME_TAG=docker.io/amd64/ubuntu:24.04 --build-arg FILE_ENV=./ci/test/00_setup_env_i686_multiprocess.sh --label=bitcoin-ci-test --tag=ci_i686_multiprocess /tmp/cirrus-build\n[07:54:50.552] Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.\n[07:54:50.576] time=\"2024-09-29T07:54:50Z\" level=warning msg=\"RunRoot is pointing to a path (/run/user/1003/containers) which is not writable. Most likely podman will fail.\"\n[07:54:50.577] Error: creating tmpdir: mkdir /run/user/1003: permission denied\n```\n\nThis error seems to stem from the CI instance itself rather than the pull."
  },
  {
   "t": "2024-09-29T09:34:11Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/util/base58_address.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1567767610,
   "text": "The choice to use chainparams to store the Base58 address prefixes has been utilized in the most recent pull. This solution simplifies the PR a noticeable amount. Long term it would be easier to modify default chain address constants than it would be to maintain the deterministic decoding mechanisms."
  },
  {
   "t": "2024-09-29T09:35:12Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/bech32.cpp",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "in_reply_to": 1566472098,
   "text": "Thank you for this insight, the faulty logic has been removed as a part of the rebase/refactor in the most recent commit."
  },
  {
   "t": "2024-10-03T08:46:25Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "src/util/chaintype.cpp",
   "commit": "526e7cc5e8bd464cd004931f36b7c98d08492d9e",
   "in_reply_to": null,
   "text": "7478ac6af922c302e292ace7f61e6eaa461da727: this change belongs in the previous commit 07f9733e6022d77d755321914a2a2a1dd7ce0d59\n\n(One way to move it there is by doing `git rebase -i HEAD~3`, setting \"e\" for the first commit, and then add these lines. Then you do a `git commit -a --amend` to update the first commit. Then `git rebase --continue`, which should automatically adjust the second commit to omit this change.)"
  },
  {
   "t": "2024-10-03T08:48:19Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "src/util/chaintype.cpp",
   "commit": "526e7cc5e8bd464cd004931f36b7c98d08492d9e",
   "in_reply_to": 1785858113,
   "text": "@maflcko I'm puzzled why the `test each commit` job didn't catch this. No test coverage? Shouldn't it use `-Werror`?"
  },
  {
   "t": "2024-10-03T09:21:00Z",
   "kind": "comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "text": "Tested and mostly happy with the first two preparation commits. Note to other reviewers: see discussion in https://github.com/bitcoin/bitcoin/pull/27260#discussion_r1567767610 for why the prefixes are hardcoded instead of derived.\n\nThe main commit fd02e7650f6410824a64f1403a98583b7ec6b0dd might be easier to review if you split it up. For example one commit that improves the base58 vs bech32 detection, another commit that that improves base58 error handling and finally one for bech32.\n\nRe last commit message, you can leave this out:\n\n[quoted text omitted]\nchance of technical debt.\n\nOnce this PR is merged, it will unclear what \"previous pull\" refers to."
  },
  {
   "t": "2024-10-04T22:38:35Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "d9c81fa04496656c37d150eefdb8b65302f5c618"
  },
  {
   "t": "2024-10-04T22:43:09Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "a0d2f72e15b6e4842418897c3f7d2d75ab0fb55a"
  },
  {
   "t": "2024-10-04T22:43:53Z",
   "kind": "review_comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "path": "src/util/chaintype.cpp",
   "commit": "526e7cc5e8bd464cd004931f36b7c98d08492d9e",
   "in_reply_to": 1785858113,
   "text": "[quoted text omitted]\n\nThis worked like a charm and I learned a new skill! Thanks"
  },
  {
   "t": "2024-10-04T22:45:14Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "13538163c871e55177a35a1e9756597eb33714ff"
  },
  {
   "t": "2024-10-04T22:46:11Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nThis has been removed."
  },
  {
   "t": "2024-10-07T10:23:52Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/util/chaintype.cpp",
   "commit": "526e7cc5e8bd464cd004931f36b7c98d08492d9e",
   "in_reply_to": 1785858113,
   "text": "[quoted text omitted]\n\nYeah, probably, that should be enabled. Ref: https://github.com/bitcoin/bitcoin/actions/runs/11091169274/job/30814507260#step:6:493\n\n```\n/home/runner/work/bitcoin/bitcoin/src/util/chaintype.cpp:47:13: warning: enumeration value 'TESTNET4' not handled in switch [-Wswitch]\n   47 |     switch (chain) {\n      |             ^~~~~\n1 warning generated."
  },
  {
   "t": "2024-10-07T10:31:16Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/util/chaintype.cpp",
   "commit": "526e7cc5e8bd464cd004931f36b7c98d08492d9e",
   "in_reply_to": 1785858113,
   "text": "Fixed in https://github.com/bitcoin/bitcoin/pull/31045"
  },
  {
   "t": "2024-12-16T07:28:21Z",
   "kind": "comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "text": "This still stands:\n\n[quoted text omitted]"
  },
  {
   "t": "2024-12-16T07:30:46Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nThank you! I will have this completed."
  },
  {
   "t": "2025-01-20T08:56:40Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "70deb6737903556e2cf030d5a29106f01b43a574"
  },
  {
   "t": "2025-02-06T09:21:56Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "src/util/chaintype.cpp",
   "commit": "526e7cc5e8bd464cd004931f36b7c98d08492d9e",
   "in_reply_to": null,
   "text": "Confirming - Is using sentence case for mainnet correct? Rest of them use lower case."
  },
  {
   "t": "2025-02-06T09:22:34Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "src/kernel/chainparams.cpp",
   "commit": "65676e5b8e63cf87d990aebce1be888955d14414",
   "in_reply_to": null,
   "text": "Nit: I found these multiple spaces after the `=` a little unusual (first time seeing this), imo it's fine to use just one.\n\n```diff\n- base58EncodedPrefixes[SECRET_KEY] =     {\"9\",\"c\"};\n+ base58EncodedPrefixes[SECRET_KEY] = {\"9\",\"c\"};\n```"
  },
  {
   "t": "2025-02-06T09:26:12Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "src/kernel/chainparams.cpp",
   "commit": "65676e5b8e63cf87d990aebce1be888955d14414",
   "in_reply_to": null,
   "text": "Super nit: Personal preference as I find it congruent with the English language and it's slightly easier on the eyes. Same for all these other newly added constants.\n\n```diff\n- base58EncodedPrefixes[PUBKEY_ADDRESS] = {\"m\",\"n\"};\n+ base58EncodedPrefixes[PUBKEY_ADDRESS] = {\"m\", \"n\"};\n```"
  },
  {
   "t": "2025-02-06T09:59:40Z",
   "kind": "review",
   "who": "rkrux",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "70deb6737903556e2cf030d5a29106f01b43a574",
   "text": "I have reviewed the first 2 commits only as I found the 3rd commit to be difficult to review. I agree with the idea of splitting the last commit into multiple commits as mentioned previously: https://github.com/bitcoin/bitcoin/pull/27260#issuecomment-2390929867.\n\nOverall I agree with the idea of improving the error messages when the address decoding fails but I don't think I agree with the below statement because from the POV of the network that address in indeed invalid. Ref: https://en.bitcoin.it/wiki/BIP_0173#:~:text=The%20human%2Dreadable%20part%20%22bc%22%5B7%5D%20for%20mainnet%2C%20and%20%22tb%22%5B8%5D%20for%20testnet.\n\n```\nThe current error not a valid Bech32 or Base58 encoding for a valid address on a different network is entirely incorrect.\n```\n\nConcept ACK @ 70deb6737903556e2cf030d5a29106f01b43a574"
  },
  {
   "t": "2025-02-22T14:25:53Z",
   "kind": "comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "text": "https://github.com/bitcoin/bitcoin/pull/31603#pullrequestreview-2634807894\n\nNot exactly what this PR is fixing but I unintentionally ended up trying network inconsistent keys in my node and faced a not so detailed error, which took some debugging to figure out. So I'm definitely in favour of better error parsing like this PR intends to do."
  },
  {
   "t": "2025-02-22T17:03:47Z",
   "kind": "review_comment",
   "who": "jonatack",
   "assoc": "MEMBER",
   "path": "src/util/chaintype.cpp",
   "commit": "526e7cc5e8bd464cd004931f36b7c98d08492d9e",
   "in_reply_to": null,
   "text": "The existing `ChainTypeToString()` in the same file above seems to already be used for displaying user-facing messages. Perhaps simpler to use it rather than adding this new one."
  },
  {
   "t": "2025-02-22T17:03:54Z",
   "kind": "review",
   "who": "jonatack",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "70deb6737903556e2cf030d5a29106f01b43a574",
   "text": "Concept ACK"
  },
  {
   "t": "2025-02-23T08:54:41Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "1bed97a78432c0fbe024dce54e8615ce83ee19d8"
  },
  {
   "t": "2025-02-23T09:01:26Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "a3b1733713459ac36a033ad2978488517930520a"
  },
  {
   "t": "2025-02-23T19:18:07Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "f974d465d738090d7391e98ce2e5b0cdecba1376"
  },
  {
   "t": "2025-02-24T09:17:22Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "Hey,\n\nSorry for the delayed updates to this PR, I just force pushed after quash the split Base58 and bech32 decoding portions. Per the request of @Sjors .\n\n There also was a substantial effort to create a proper set of functional tests that actually test properly. Examples would be that now with the correct network decoding some errors became network aware and as such needed to be converted to the correct network. Example would be the bech32 padding issue. _test/functional/rpc_validateaddress.py line 55_\n\nI will be working on addressing some of the more recent comments in the coming day.\n\nThanks,\nRusseree"
  },
  {
   "t": "2025-04-01T12:04:49Z",
   "kind": "comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nIs this still in the pipeline, or do you prefer if we review as-is?"
  },
  {
   "t": "2025-04-08T12:03:40Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "I should have done all of the splitting up as well as revised the tests to match for the new address decoding conditions."
  },
  {
   "t": "2025-05-15T09:50:24Z",
   "kind": "comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "text": "Any particular reason for marking this draft?"
  },
  {
   "t": "2025-05-17T01:26:52Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nYes, I was going to work on the tests for this PR to enable testing with multiple networks, currently the tests had to be refactored to work with mainnet based addresses because of the network awareness."
  },
  {
   "t": "2025-06-03T23:27:20Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "b7de615dbc744d60082951da229feb229256cf2d"
  },
  {
   "t": "2025-06-03T23:28:15Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "13447b21f973933830b305db5282aca8fc27e780"
  },
  {
   "t": "2025-06-04T02:52:56Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "2f2470e844c79695df0140103c73d742371554cc"
  },
  {
   "t": "2025-06-04T02:57:37Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "https://github.com/bitcoin/bitcoin/pull/27260/commits/2f2470e844c79695df0140103c73d742371554cc\n\nThis is the one! with this commit I have enabled multi network functional testing [Signet, Mainnet] this enables proof that under different networks the results will match expectations. This also had a few benefits too!\n\nPreviously commented out tests are now valid!\nA lot of errors are now properly handed on a per network basis!\n\nThanks, and ready for review!"
  },
  {
   "t": "2025-07-17T00:00:02Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_invalid_address_message.py",
   "commit": "40d33af62bc5912f3e12d86376a7bcfbf7222dcd",
   "in_reply_to": null,
   "text": "Q: when do we refer to it as `Bech32` and when `Bech32(m)`?"
  },
  {
   "t": "2025-07-17T00:03:57Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_invalid_address_message.py",
   "commit": "40d33af62bc5912f3e12d86376a7bcfbf7222dcd",
   "in_reply_to": null,
   "text": "It would help with the review if commits only had a single focus: separating low risk refactors with higher risk behavioral changes."
  },
  {
   "t": "2025-07-17T00:05:38Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_validateaddress.py",
   "commit": "5f7fdc05f62c5ae40a995aaf8e2d4289658cec67",
   "in_reply_to": null,
   "text": "what's the story behind these, could we add them to the test suite instead of deleting them?\nWhy were they committed like this in the first place?"
  },
  {
   "t": "2025-07-17T00:07:52Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_validateaddress.py",
   "commit": "08a76c47a7f7f776df38f621697aa63503a28369",
   "in_reply_to": null,
   "text": "could we rather store them in a dictionary above, keyed by `network_name`?\n```python\nINVALID_DATA = {\n    \"mainnet\": [\n        (\"tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty\", \"Invalid or unsupported prefix for Segwit (Bech32) Bitcoin address (expected bc, got tc)\", []),\n...\n    ],\n    \"signet\": [\n        (\"tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty\", \"Invalid or unsupported prefix for Segwit (Bech32) signet address (expected tb, got tc)\", []),\n...\n    ],\n}\n\nVALID_DATA = {\n    \"mainnet\": [\n        (\"BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4\", \"0014751e76e8199196d454941c45d1b3a323f1433bd6\"),\n...\n    ],\n    \"signet\": [\n        (\"tb1pfees9rn5nz\", \"51024e73\"),\n...\n    ],\n}\n```\nand\n```python\n    def test_validateaddress_on_network(self, network_name):\n        self.log.info(f\"Testing validateaddress on {network_name}\")\n        for (addr, error, locs) in INVALID_DATA[network_name]:\n            self.check_invalid(addr, error, locs)\n        for (addr, spk) in VALID_DATA[network_name]:\n            self.check_valid(addr, spk)\n```"
  },
  {
   "t": "2025-07-17T00:47:12Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_validateaddress.py",
   "commit": "08a76c47a7f7f776df38f621697aa63503a28369",
   "in_reply_to": null,
   "text": "Not sure this is the best way to test this, starting it up in signet mode and stopping and clearing and overwriting the args - can we rather make them parameterizable, something like:\n```python\nclass ValidateAddressSignetTest(BaseValidateAddressTest):\n    def set_test_params(self):\n        super().set_test_params()\n        self.network_name = \"signet\"\n        self.chain = \"signet\"\n        self.extra_args = [[\"-prune=899\", \"-signet\"]]\n\nclass ValidateAddressMainnetTest(BaseValidateAddressTest):\n    def set_test_params(self):\n        super().set_test_params()\n        self.network_name = \"mainnet\"\n        self.chain = \"\"\n        self.extra_args = [[\"-prune=899\"]]\n\nif __name__ == \"__main__\":\n    ValidateAddressSignetTest(__file__).main()\n    ValidateAddressMainnetTest(__file__).main()\n```\n(if this is even possible, haven't tried it, my point is better separation of concerns)"
  },
  {
   "t": "2025-07-17T04:36:04Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/key_io.cpp",
   "commit": "6bcaa46a7640196766922bc1435d96f17a5e751e",
   "in_reply_to": null,
   "text": "We should find a way to avoid digging into the internals of `LocateErrors` - maybe we could return a proper type instead of `std::pair<std::string, std::vector<int>> LocateErrors` which would return the error category (as enum?) instead of the text directly - the users of `LocateErrors` should decide the exact error message per error code."
  },
  {
   "t": "2025-07-17T04:39:29Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/key_io.cpp",
   "commit": "cd3cd31f86799fa58ef3808a742f1be0c990cc76",
   "in_reply_to": null,
   "text": "we could invert these conditions to start with the non-negated versions, it flows more naturally to do `if (condition) ... else` compared to `if (!condition) ... else`"
  },
  {
   "t": "2025-07-17T04:42:21Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/key_io.cpp",
   "commit": "20138f85cd1362f68960e2f94677b740fa1c12ec",
   "in_reply_to": null,
   "text": "I know this was here before as well, but we have already checked `is_bech32` in the if condition, we could break up `if (!is_bech32 && DecodeBase58Check(str, data, MAX_BASE58_CHECK_CHARS)) {` into an ` if (!is_bech32) { if (DecodeBase58Check) ... } else { ... }` instead - preferably inverting it as well to `if (is_bech32) {} else if (DecodeBase58Check...)`. If you decide to accept these comments, please do it in multiple, focused commits, the changes should guide the reviewer and tell a story."
  },
  {
   "t": "2025-07-17T04:45:24Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/key_io.cpp",
   "commit": "20138f85cd1362f68960e2f94677b740fa1c12ec",
   "in_reply_to": null,
   "text": "maybe we could just join them via comma instead, something like:\n```C++\nconst auto prefixes{util::Join(encoded_prefixes, \", \")};\n```\nor combining it with the above:\n```C++\nconst auto prefixes{util::Join(Cat(std::vector(params.Base58EncodedPrefix(CChainParams::SCRIPT_ADDRESS)),\n                                   params.Base58EncodedPrefix(CChainParams::PUBKEY_ADDRESS)), \", \")};\n\n```\n(untested and we'd likely have to adjust the full texts accordingly)\n\n-----\n\nor combining it with the above, maybe this instead:\n```C++\nstd::string prefixes;\nfor (const auto& prefix : params.Base58EncodedPrefix(CChainParams::SCRIPT_ADDRESS)) {\n    if (!prefixes.empty()) prefixes += \", \";\n    prefixes += prefix;\n}\nfor (const auto& prefix : params.Base58EncodedPrefix(CChainParams::PUBKEY_ADDRESS)) {\n    if (!prefixes.empty()) prefixes += \", \";\n    prefixes += prefix;\n}\n\n```"
  },
  {
   "t": "2025-07-17T05:05:00Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/key_io.cpp",
   "commit": "6bcaa46a7640196766922bc1435d96f17a5e751e",
   "in_reply_to": null,
   "text": "as mentioned, if we invert the condition we'd have `if (is_bech32) { ... } else if (check_base58()).\nBut I'm not even sure why these two are extracted, I don't find the `check_base58` or `is_bech32` to be a helpful abstraction here - I'd inline them\n\nAlso, bech32 and base58 shouldn't be handled in the same method, they're not the same responsibility - could you please extract their handling to smaller, more focused methods?\n\nI'd test and extract them in separate commits as well, I don't see a reason for combining them in any way."
  },
  {
   "t": "2025-07-17T05:12:58Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/key_io.cpp",
   "commit": "921a79c407261ee3f3154943920c8db66d7304d5",
   "in_reply_to": null,
   "text": "does it even make sense to run `bech32::LocateErrors` when `bech32_encoding != bech32::Encoding::INVALID`? Seems a bit all over the place."
  },
  {
   "t": "2025-07-17T05:14:31Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/key_io.cpp",
   "commit": "40d33af62bc5912f3e12d86376a7bcfbf7222dcd",
   "in_reply_to": null,
   "text": "I find it confusing that when we don't have valid bech32 chars we report that it's not a valid base58"
  },
  {
   "t": "2025-07-17T05:15:25Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_validateaddress.py",
   "commit": "5f7fdc05f62c5ae40a995aaf8e2d4289658cec67",
   "in_reply_to": null,
   "text": "could you please provide any explanation in the commit message why these were discarded?"
  },
  {
   "t": "2025-07-17T05:26:05Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/kernel/chainparams.cpp",
   "commit": "65676e5b8e63cf87d990aebce1be888955d14414",
   "in_reply_to": 1944386520,
   "text": "Yes, please format the modified code according to the specified formatter"
  },
  {
   "t": "2025-07-17T05:27:24Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/kernel/chainparams.cpp",
   "commit": "5f7fdc05f62c5ae40a995aaf8e2d4289658cec67",
   "in_reply_to": null,
   "text": "as mentioned by @Sjors, I think we may want to leave room for Silent Payment prefixes as well: [`9219e4f` (#28201)](https://github.com/bitcoin/bitcoin/pull/28201/commits/9219e4f2a61d0d0b6590c443ceda4665a73c9a6b)\n\nProbably nothing to do yet, just good to know about it - cc: @josibake"
  },
  {
   "t": "2025-07-17T05:34:14Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/util/chaintype.cpp",
   "commit": "526e7cc5e8bd464cd004931f36b7c98d08492d9e",
   "in_reply_to": 1966558267,
   "text": "Or maybe only store the difference:\n```C++\nstd::string ChainTypeToDisplayString(ChainType chain)\n{\n    switch (chain) {\n    case ChainType::MAIN: return \"Bitcoin\";\n    case ChainType::TESTNET: return \"testnet\";\n    default: return ChainTypeToString(chain);\n    }\n}\n```"
  },
  {
   "t": "2025-07-17T05:34:27Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/util/chaintype.cpp",
   "commit": "526e7cc5e8bd464cd004931f36b7c98d08492d9e",
   "in_reply_to": 1944379865,
   "text": "Yeah, it is kinda' weird"
  },
  {
   "t": "2025-07-17T05:36:01Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/util/chaintype.h",
   "commit": "526e7cc5e8bd464cd004931f36b7c98d08492d9e",
   "in_reply_to": null,
   "text": "The header order should ideally be the same as the implementation, unless there's a reason for it:\n```suggestion\nstd::string ChainTypeToString(ChainType chain);\nstd::string ChainTypeToDisplayString(ChainType chain);\n```"
  },
  {
   "t": "2025-07-17T05:39:02Z",
   "kind": "review",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "state": "CHANGES_REQUESTED",
   "commit": "2f2470e844c79695df0140103c73d742371554cc",
   "text": "Concept ACK, we should indeed make the error messages more user friendly.\n\nIt seems to me the PR is heading in the right direction, but we need to separate handling unrelated code paths - bech32 and base58 are different enough that they deserve their own helper method, not just buried somewhere in an if condition.\nThe functional tests could also use better separation, without favoring one or the other in the default params and the commit messages should explain the context better."
  },
  {
   "t": "2025-10-22T15:39:10Z",
   "kind": "comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "text": "Are you still working on this?"
  },
  {
   "t": "2025-10-22T17:01:49Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "Actually yes! Found some time this week. Please allow for a push today!\n\nThanks!"
  },
  {
   "t": "2025-11-02T05:51:03Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "40d33af62bc5912f3e12d86376a7bcfbf7222dcd"
  },
  {
   "t": "2025-11-02T15:58:26Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "f8513e38b369889df0b402f06d67fcf656495d53"
  },
  {
   "t": "2025-11-11T07:37:51Z",
   "kind": "comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "text": "CI fails with:\n\n```\nBech32 address decoded with error: Invalid character or mixed case == Bech32(m) address decoded with error: Invalid character or mixed case\n```"
  },
  {
   "t": "2025-11-11T07:51:22Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "src/util/chaintype.cpp",
   "commit": "526e7cc5e8bd464cd004931f36b7c98d08492d9e",
   "in_reply_to": 1944379865,
   "text": "In 055dbaed69a2577b967fae3d9b7646ef3b01a254 _Added chaintype user-facing string display_:\n\nThis is used as follows in later commits:\n\n[quoted text omitted]\nIn the original code it would not specify the network:\n\n[quoted text omitted]\nI don't think it's very useful to add the network name to address. Certainly not for mainnet, because most users have no idea (and no need to know) about test networks.\n\nMy suggestion would be drop this helper entirely."
  },
  {
   "t": "2025-11-11T07:55:11Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "src/kernel/chainparams.cpp",
   "commit": "5f7fdc05f62c5ae40a995aaf8e2d4289658cec67",
   "in_reply_to": 2212299671,
   "text": "In 7b71e6e056f5567152097d5c9a1a8e2f59c1b661 _Include Base58 encoded prefixes in chainparams_: this commit only adds base58 prefixes, silent payments will use bech32m."
  },
  {
   "t": "2025-11-11T08:03:32Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_validateaddress.py",
   "commit": "5f7fdc05f62c5ae40a995aaf8e2d4289658cec67",
   "in_reply_to": 2211859463,
   "text": "In f8513e38b369889df0b402f06d67fcf656495d53 _[Functional] Introduce muti network testing_:\n\nThese were disabled in #27727, IIUC in favour the official test vectors. Seems fine to delete them. If they're actually interesting, then they can be restored and added to the BIP.\n\n(nit: typo in commit message)"
  },
  {
   "t": "2025-11-11T08:05:45Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_validateaddress.py",
   "commit": "f8513e38b369889df0b402f06d67fcf656495d53",
   "in_reply_to": null,
   "text": "In f8513e38b369889df0b402f06d67fcf656495d53 _[Functional] Introduce muti network testing_: the extra `(m)` breaks the test"
  },
  {
   "t": "2025-11-11T08:11:20Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_validateaddress.py",
   "commit": "08a76c47a7f7f776df38f621697aa63503a28369",
   "in_reply_to": 2211861199,
   "text": "In f8513e38b369889df0b402f06d67fcf656495d53 _[Functional] Introduce muti network testing_:\n\nThe elegant solution imo is to move these test vectors into a JSON file, see e.g. `rpc_getblockstats.py`.\n\nBut I think the current approach is fine. You could also duplicate the body of  `test_validateaddress_on_network` into `test_validateaddress_mainnet` and `test_validateaddress_signet` rather than copying the constants. Each for loop could then be preceded with `self.log.debug(\"Valid mainnet addresses\")`, etc."
  },
  {
   "t": "2025-11-11T08:16:12Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_validateaddress.py",
   "commit": "08a76c47a7f7f776df38f621697aa63503a28369",
   "in_reply_to": 2211903391,
   "text": "If this works out of the box it's worth taking, but otherwise I would keep the current approach. Address validation is simple enough that I'm not worried about the node being in a confused state."
  },
  {
   "t": "2025-11-11T08:17:20Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "src/key_io.cpp",
   "commit": "f8513e38b369889df0b402f06d67fcf656495d53",
   "in_reply_to": null,
   "text": "Nit for c974f892c7b6a61630c555f08ec201d911d5fd62 _Bech32 decoding logic_:  unrelated whitespace change and random looking `asdas` in the commit message."
  },
  {
   "t": "2025-11-11T08:25:15Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "src/key_io.cpp",
   "commit": "6bcaa46a7640196766922bc1435d96f17a5e751e",
   "in_reply_to": 2212265800,
   "text": "In 04d5d4acab4259505654a506c838fecb29fdb88d _Base58 decoding logic + bech32 decoding network awareness_: splitting bech32 and base58 handling in an earlier commit might also help to focus the current commit more on base58. I still a lot of lines touching bech32 code."
  },
  {
   "t": "2025-11-11T08:27:47Z",
   "kind": "review",
   "who": "Sjors",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "f8513e38b369889df0b402f06d67fcf656495d53",
   "text": "Thanks for splitting base58 and bech32 stuff into separate commits. I think that  04d5d4acab4259505654a506c838fecb29fdb88d _Base58 decoding logic + bech32 decoding network awareness_ could itself be split, see inline comment from @l0rinc, since it still contains a lot of bech32 changes despite the commit name.\n\nMy main other suggestion is to drop the first commit (and don't add the network name to error messages).\n\nSee inline comment for how to fix the test."
  },
  {
   "t": "2025-11-16T04:45:55Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "526e7cc5e8bd464cd004931f36b7c98d08492d9e"
  },
  {
   "t": "2026-01-08T05:20:01Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nOkay I, set aside some time to work on this PR tonight. If there is no reason to add the network name to the error messages then this whole PR is kind of a moot point and should be closed. https://github.com/bitcoin/bitcoin/issues/26290\n\nI am completely okay with this if that is the case.\n\nEdit: I see what you mean remove the network name and only display the prefixes."
  },
  {
   "t": "2026-01-08T06:12:48Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "4532e00e071c357ebcd1960d87628c67e7198adf"
  },
  {
   "t": "2026-01-08T06:17:59Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "7a3a689f42d16a22c2b150098fa1a84be408cbe3"
  },
  {
   "t": "2026-01-08T06:19:22Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "f108661214813339e25142d128e87ff026a2d1b2"
  },
  {
   "t": "2026-01-08T06:24:47Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "9a994264d6637ed9be1fcfff6a9ad4fcd5778e3a"
  },
  {
   "t": "2026-01-08T06:26:32Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "03716cc2e1fe9f03292f6c7281d079f67c9170f1"
  },
  {
   "t": "2026-01-08T06:27:16Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "6bcaa46a7640196766922bc1435d96f17a5e751e"
  },
  {
   "t": "2026-01-08T06:53:51Z",
   "kind": "review_comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "path": "src/kernel/chainparams.cpp",
   "commit": "65676e5b8e63cf87d990aebce1be888955d14414",
   "in_reply_to": 1944380861,
   "text": "FWIW I like the vertical alignment, but I'm not a linter :-)"
  },
  {
   "t": "2026-01-08T07:05:48Z",
   "kind": "comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "text": "Quick note as of 6bcaa46a7640196766922bc1435d96f17a5e751e. IIUC you rebased, and then dropped 055dbaed69a2577b967fae3d9b7646ef3b01a254 _Added chaintype user-facing string display_, adjusting things where needed. But I guess you're still working on potentially refactoring 870c850b7d7c492e365b3d6b7dec64f7e17a633e _Base58 decoding logic + bech32 decoding network awareness_ and 2df89b6ffdab851ec9e6a5c090305a4f323114ae _Bech32 decoding logic_ based on earlier reviews?"
  },
  {
   "t": "2026-01-08T07:09:27Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nAbsolutely, this is the correct understanding of this, will re-request and pull out of draft when ready.  I may respond to a few of the critiques, during this refactor.\n\nThanks again for the review."
  },
  {
   "t": "2026-01-08T08:31:41Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "73e3246f4eb4c6874999660632a3672049a999f0"
  },
  {
   "t": "2026-01-08T08:36:34Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "4232872dab3814afc0e5687fa4d7e7050ae9dfd3"
  },
  {
   "t": "2026-01-08T08:41:09Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "0829d2d4d735c80abb56cb0e44426e496f33c53c"
  },
  {
   "t": "2026-01-08T08:49:30Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "a9c3b1635346e5bd9f2b247b0ea322f25c921ecc"
  },
  {
   "t": "2026-01-08T08:50:16Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "65676e5b8e63cf87d990aebce1be888955d14414"
  },
  {
   "t": "2026-01-08T08:52:00Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "08a76c47a7f7f776df38f621697aa63503a28369"
  },
  {
   "t": "2026-01-08T09:35:01Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "743530dab3841facfc0e577972c51df6777962f5"
  },
  {
   "t": "2026-01-08T09:35:28Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "921a79c407261ee3f3154943920c8db66d7304d5"
  },
  {
   "t": "2026-01-08T09:53:16Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "a3e6139a8d62b42a18b479b9538a8b2c54465dc1"
  },
  {
   "t": "2026-01-08T10:22:12Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nef5e5170bf39601a25409b2d26e0554576c6bbed I am using this as a setup commit for the more logic like sections that are handled in key_io.cpp\n\nOne of the hardest portions seems to be is that at some point this all converges into a case where you have to test that you don't have valid base58 or valid bech32 which inherently will have to run checks for both."
  },
  {
   "t": "2026-01-08T10:29:51Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "40db0066bc3b8c79948b62f9597d0f629a1d660a"
  },
  {
   "t": "2026-01-08T10:35:18Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "223a7092efb0e1b010f36b53c47917270672dc7b"
  },
  {
   "t": "2026-01-08T10:41:19Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "42bddb2dc377a350b4b7ca2a4f4da2085346a8b0"
  },
  {
   "t": "2026-01-08T11:06:12Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "d82dcb91c62245daa88a0d79ef544d0db65a6e08"
  },
  {
   "t": "2026-01-08T15:46:11Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "c2d9fc732cc69eb7d5064f6a1db6dc4ac4523d43"
  },
  {
   "t": "2026-01-08T17:23:14Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "cd3cd31f86799fa58ef3808a742f1be0c990cc76"
  },
  {
   "t": "2026-01-08T18:21:49Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "6bc621ec037fa980bef10bd7049178eaa02a7c7e"
  },
  {
   "t": "2026-01-09T02:28:23Z",
   "kind": "comment",
   "who": "Sjors",
   "assoc": "MEMBER",
   "text": "The \"test max 6 ancestor commits\" job [fails](https://github.com/bitcoin/bitcoin/actions/runs/20827264801/job/59831790940?pr=27260#step:8:3139) at eacf78ca650f006742eaf36300e6f4ac1374dec3 _General address decoding logic exe order_.\n\nThis should fix it, by moving later changes into that commit: https://github.com/Sjors/bitcoin/commit/aabb7df204ea46402121badb8ffe14ef068301f2\n\nSome of the commit messages have weird trailing characters (adasda, etc).\n\nNoticed there's still a lot of bech32 related changes in c2c8454cdd413680e61c96dacdb912ca198847aa _Base58 decoding logic_: despite the commit title, maybe split it further?"
  },
  {
   "t": "2026-01-09T02:44:33Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "20138f85cd1362f68960e2f94677b740fa1c12ec"
  },
  {
   "t": "2026-01-09T02:46:03Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nThank you for the fixup! Applied\n\nEdit- Per the messages, it was getting late and I was flogging the rebase -i and made a mistake"
  },
  {
   "t": "2026-01-13T12:55:57Z",
   "kind": "comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "text": "@portlandhodl, ping us when the PR is ready for review again."
  },
  {
   "t": "2026-03-21T06:11:13Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "776b62b1205f53564f447f471b2a3c24d2e4ef22"
  },
  {
   "t": "2026-03-21T06:12:38Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "173eed98f3304761adb562f3bf9f6d4d4fb495bb"
  },
  {
   "t": "2026-03-21T06:13:30Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "7fd3a77022ebf2f3af6bbeafe0e29663772f148f"
  },
  {
   "t": "2026-03-21T07:33:17Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "fde1c3e75c9d8ef70ed761675cb3481b4a55607f"
  },
  {
   "t": "2026-03-21T07:49:09Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "3944a3313fceb486df84936c7090f5a4499f5718"
  },
  {
   "t": "2026-03-21T08:13:14Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "09434953b40def760cb2220548188bd85beec520"
  },
  {
   "t": "2026-03-21T14:17:29Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "a46eef3c7daae0c52126f23e71e23ab4dd669106"
  },
  {
   "t": "2026-03-21T14:21:51Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "77034cd32e0b7c2b1321e40b6f4df51fc04d38c7"
  },
  {
   "t": "2026-03-21T15:08:12Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "473d501c786f849446bed49bb2f8e2bae46a26e1"
  },
  {
   "t": "2026-03-21T17:52:38Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "41d82e57e1cc02d852830c9d219899bfabff1349"
  },
  {
   "t": "2026-03-22T01:06:22Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "630316238d5fee27f5bc9e2c611937289c7791be"
  },
  {
   "t": "2026-03-22T14:52:36Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "8021845dfd7549b720024ba356ffa1ddb9856630"
  },
  {
   "t": "2026-03-22T15:16:34Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "b78373188ab88ab0a9049e62a85146d5516cb10e"
  },
  {
   "t": "2026-03-22T21:30:22Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "@l0rinc review ready, notable changes here\n - Fall through base58 logic\n - bech32 decode first, then base58\n\n Nice things I wish I had\n bech32::LocateErrors would return an Enum instead of a string."
  },
  {
   "t": "2026-04-20T06:30:37Z",
   "kind": "comment",
   "who": "sedited",
   "assoc": "MEMBER",
   "text": "@l0rinc @Sjors @rkrux can you take another look here?"
  },
  {
   "t": "2026-04-20T07:18:47Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/key_io.cpp",
   "commit": "20138f85cd1362f68960e2f94677b740fa1c12ec",
   "in_reply_to": 2212242754,
   "text": "This is still done manually in the latest push"
  },
  {
   "t": "2026-04-20T07:25:18Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/kernel/chainparams.cpp",
   "commit": "b3bd890e91c84198ad5101c4ed3a92786ef90c6a",
   "in_reply_to": null,
   "text": "[quoted text omitted]\n\n`base58Prefixes` populates every role, seems incomplete to only populate `PUBKEY_ADDRESS` and `SCRIPT_ADDRESS` - especially since this change is extracted to a new commit.\n\n---\n\nAnd to avoid having to go back and forth between commits during review, can you please help us explain how these changes will fit into the following commits in the commit message, maybe something like:\n\n[quoted text omitted]\nPopulating every role keeps the table symmetric with `base58Prefixes`.\n\n---\n\nAnd to make sure each step is fully functional (and doesn't break in future steps), we could cover each commit's changes with some simple tests (also serving as live documentation):\n```patch\ndiff --git a/src/kernel/chainparams.cpp b/src/kernel/chainparams.cpp\nindex 02c7ae9d22..b03f242e78 100644\n--- a/src/kernel/chainparams.cpp\n+++ b/src/kernel/chainparams.cpp\n@@ -147,6 +147,11 @@ public:\n         base58Prefixes[SECRET_KEY] =     std::vector<unsigned char>(1,128);\n         base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x88, 0xB2, 0x1E};\n         base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x88, 0xAD, 0xE4};\n+        base58PrefixText[PUBKEY_ADDRESS] = {\"1\"};\n+        base58PrefixText[SCRIPT_ADDRESS] = {\"3\"};\n+        base58PrefixText[SECRET_KEY] = {\"5\", \"K\", \"L\"};\n+        base58PrefixText[EXT_PUBLIC_KEY] = {\"xpub\"};\n+        base58PrefixText[EXT_SECRET_KEY] = {\"xprv\"};\n\n         bech32_hrp = \"bc\";\n\n@@ -260,6 +265,11 @@ public:\n         base58Prefixes[SECRET_KEY] =     std::vector<unsigned char>(1,239);\n         base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};\n         base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};\n+        base58PrefixText[PUBKEY_ADDRESS] = {\"m\", \"n\"};\n+        base58PrefixText[SCRIPT_ADDRESS] = {\"2\"};\n+        base58PrefixText[SECRET_KEY] = {\"9\", \"c\"};\n+        base58PrefixText[EXT_PUBLIC_KEY] = {\"tpub\"};\n+        base58PrefixText[EXT_SECRET_KEY] = {\"tprv\"};\n\n         bech32_hrp = \"tb\";\n\n@@ -365,6 +375,11 @@ public:\n         base58Prefixes[SECRET_KEY] =     std::vector<unsigned char>(1,239);\n         base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};\n         base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};\n+        base58PrefixText[PUBKEY_ADDRESS] = {\"m\", \"n\"};\n+        base58PrefixText[SCRIPT_ADDRESS] = {\"2\"};\n+        base58PrefixText[SECRET_KEY] = {\"9\", \"c\"};\n+        base58PrefixText[EXT_PUBLIC_KEY] = {\"tpub\"};\n+        base58PrefixText[EXT_SECRET_KEY] = {\"tprv\"};\n\n         bech32_hrp = \"tb\";\n\n@@ -506,6 +521,11 @@ public:\n         base58Prefixes[SECRET_KEY] =     std::vector<unsigned char>(1,239);\n         base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};\n         base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};\n+        base58PrefixText[PUBKEY_ADDRESS] = {\"m\", \"n\"};\n+        base58PrefixText[SCRIPT_ADDRESS] = {\"2\"};\n+        base58PrefixText[SECRET_KEY] = {\"9\", \"c\"};\n+        base58PrefixText[EXT_PUBLIC_KEY] = {\"tpub\"};\n+        base58PrefixText[EXT_SECRET_KEY] = {\"tprv\"};\n\n         bech32_hrp = \"tb\";\n\n@@ -638,6 +658,11 @@ public:\n         base58Prefixes[SECRET_KEY] =     std::vector<unsigned char>(1,239);\n         base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};\n         base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};\n+        base58PrefixText[PUBKEY_ADDRESS] = {\"m\", \"n\"};\n+        base58PrefixText[SCRIPT_ADDRESS] = {\"2\"};\n+        base58PrefixText[SECRET_KEY] = {\"9\", \"c\"};\n+        base58PrefixText[EXT_PUBLIC_KEY] = {\"tpub\"};\n+        base58PrefixText[EXT_SECRET_KEY] = {\"tprv\"};\n\n         bech32_hrp = \"bcrt\";\n\ndiff --git a/src/kernel/chainparams.h b/src/kernel/chainparams.h\nindex f7209bee1b..ff2811d428 100644\n--- a/src/kernel/chainparams.h\n+++ b/src/kernel/chainparams.h\n@@ -112,6 +112,8 @@ public:\n     /** Return the list of hostnames to look up for DNS seeds */\n     const std::vector<std::string>& DNSSeeds() const { return vSeeds; }\n     const std::vector<unsigned char>& Base58Prefix(Base58Type type) const { return base58Prefixes[type]; }\n+    /** Display prefixes (e.g. \"1\", \"xpub\") for this base58 role on this network. */\n+    const std::vector<std::string>& Base58PrefixText(Base58Type type) const { return base58PrefixText[type]; }\n     const std::string& Bech32HRP() const { return bech32_hrp; }\n     const std::vector<uint8_t>& FixedSeeds() const { return vFixedSeeds; }\n     const HeadersSyncParams& HeadersSync() const { return m_headers_sync_params; }\n@@ -171,6 +173,7 @@ protected:\n     uint64_t m_assumed_chain_state_size;\n     std::vector<std::string> vSeeds;\n     std::vector<unsigned char> base58Prefixes[MAX_BASE58_TYPES];\n+    std::vector<std::string> base58PrefixText[MAX_BASE58_TYPES];\n     std::string bech32_hrp;\n     ChainType m_chain_type;\n     CBlock genesis;\ndiff --git a/src/test/key_io_tests.cpp b/src/test/key_io_tests.cpp\nindex 2ea9c0b8ef..1cacdb398b 100644\n--- a/src/test/key_io_tests.cpp\n+++ b/src/test/key_io_tests.cpp\n@@ -17,6 +17,8 @@\n #include <boost/test/unit_test.hpp>\n\n #include <algorithm>\n+#include <array>\n+#include <utility>\n\n BOOST_FIXTURE_TEST_SUITE(key_io_tests, BasicTestingSetup)\n\n@@ -147,4 +149,29 @@ BOOST_AUTO_TEST_CASE(key_io_invalid)\n     }\n }\n\n+// Goal: check that each network's base58 display prefixes match what user-facing\n+// error messages (e.g. in DecodeDestination) will reference.\n+BOOST_AUTO_TEST_CASE(base58_prefix_text)\n+{\n+    using Entry = std::pair<CChainParams::Base58Type, std::vector<std::string>>;\n+    using Prefixes = std::array<Entry, CChainParams::MAX_BASE58_TYPES>;\n+    using enum Entry::first_type;\n+\n+    const Prefixes mainnet{{{PUBKEY_ADDRESS, {\"1\"}}, {SCRIPT_ADDRESS, {\"3\"}}, {SECRET_KEY, {\"5\", \"K\", \"L\"}}, {EXT_PUBLIC_KEY, {\"xpub\"}}, {EXT_SECRET_KEY, {\"xprv\"}}}};\n+    const Prefixes testnet{{{PUBKEY_ADDRESS, {\"m\", \"n\"}}, {SCRIPT_ADDRESS, {\"2\"}}, {SECRET_KEY, {\"9\", \"c\"}}, {EXT_PUBLIC_KEY, {\"tpub\"}}, {EXT_SECRET_KEY, {\"tprv\"}}}};\n+\n+    const auto check{[](ChainType chain, const Prefixes& expected) {\n+        const auto params{CreateChainParams(ArgsManager{}, chain)};\n+        for (const auto& [type, values] : expected) {\n+            const auto& actual{params->Base58PrefixText(type)};\n+            BOOST_CHECK_EQUAL_COLLECTIONS(actual.begin(), actual.end(), values.begin(), values.end());\n+        }\n+    }};\n+\n+    check(ChainType::MAIN, mainnet);\n+    for (const auto chain : {ChainType::TESTNET, ChainType::TESTNET4, ChainType::SIGNET, ChainType::REGTEST}) {\n+        check(chain, testnet);\n+    }\n+}\n+\n BOOST_AUTO_TEST_SUITE_END()\n```"
  },
  {
   "t": "2026-04-20T07:30:44Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_validateaddress.py",
   "commit": "5f7fdc05f62c5ae40a995aaf8e2d4289658cec67",
   "in_reply_to": 2211859463,
   "text": "Thanks for clarifying, could these be done in a separate commit with the above explanation?\nThe second commit is still too big, containing many unrelated changes, moves, and deletes in a single intertwined change."
  },
  {
   "t": "2026-04-20T07:33:30Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_invalid_address_message.py",
   "commit": "40d33af62bc5912f3e12d86376a7bcfbf7222dcd",
   "in_reply_to": 2211858218,
   "text": "This still applies, I personally have a hard time reviewing it as such, it still bundles several unrelated concerns.\n\nConcrete split for the second commit I'd suggest:\n* JSON migration/deletion in `rpc_validateaddress.py` as its own commit, explaining the deletes in the commit message.\n* Renames/restructures (e.g. structured bindings for `bech32::Decode`, `dec.*` -> `bech32_*`) should also be separate in commits where they're easily explained and moves don't modify the code, making changes easier to review in follow-up commits.\n* Bech32-before-Base58 deserves its own commit; it's the actual behavior change here that's hidden too deep. We could explain in the commit message why the previous order misrouted valid Bech32 addresses on wrong networks.\n\nAnd commit 3 still lands several `Bech32` changes even though it only mentions `Base58` - the `bech32` mixed-case input detection could be split from fallback diagnostics."
  },
  {
   "t": "2026-04-20T08:25:09Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/kernel/chainparams.h",
   "commit": "b3bd890e91c84198ad5101c4ed3a92786ef90c6a",
   "in_reply_to": null,
   "text": "[quoted text omitted]\n\nSSO should already make these cheap, let's use `std::string` instead.\nThat's consistent with the rest of `CChainParams` and removes the potential lifetime footgun."
  },
  {
   "t": "2026-04-20T08:49:14Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/key_io.cpp",
   "commit": "b3bd890e91c84198ad5101c4ed3a92786ef90c6a",
   "in_reply_to": null,
   "text": "[quoted text omitted]\n\nDo we really need to reparse `str` here? Could we instead have a single path that lowers up front to avoid duplicated work?\n\n---\n\nnit: please reformat the changes before pushing to avoid these inconsistencies"
  },
  {
   "t": "2026-04-20T08:50:27Z",
   "kind": "review_comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "path": "src/key_io.cpp",
   "commit": "b3bd890e91c84198ad5101c4ed3a92786ef90c6a",
   "in_reply_to": null,
   "text": "[quoted text omitted]\n\nmixed == has both lower and upper, consider something like:\n```C++\nstd::ranges::any_of(str, ::isupper) && std::ranges::any_of(str, ::islower)\n```"
  },
  {
   "t": "2026-04-20T08:59:35Z",
   "kind": "review",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "state": "CHANGES_REQUESTED",
   "commit": "b78373188ab88ab0a9049e62a85146d5516cb10e",
   "text": "[quoted text omitted]\n\nIt seemed to me that the PR wasn't ready for re-review yet, many of my comments weren't applied or responded to, I assumed it's still WIP.\n\nI rechecked and my biggest concern (unrelated changes intertwined in big commits and commit messages not explaining the change) is still unaddressed.\nI have a hard time reviewing this meaningfully - without redoing everything locally, which I would like to avoid.\n\nLeft a few comments. I can continue the review if the change is split into more focused, small commits, separating behavior changes from moves and refactors."
  },
  {
   "t": "2026-04-20T18:11:26Z",
   "kind": "comment",
   "who": "portlandhodl",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nPer @l0rinc comments and after my own review of them; I am going to move this into a draft state, given the issues present (valid) I don't think time by the other reviewers requested would be well spent."
  },
  {
   "t": "2026-06-28T05:57:33Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "b3bd890e91c84198ad5101c4ed3a92786ef90c6a"
  },
  {
   "t": "2026-08-25T05:41:24Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "dc54682b083eb277a0cabee3a5bab6bce2dbaabe"
  },
  {
   "t": "2026-08-25T05:48:11Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "82a932ea889f1a466ff3ccdce979386e5a15d0e2"
  },
  {
   "t": "2026-08-25T06:24:34Z",
   "kind": "comment",
   "who": "l0rinc",
   "assoc": "MEMBER",
   "text": "@portlandhodl, let us know when the PR is ready to be moved out of draft for a re-review"
  },
  {
   "t": "2026-08-25T06:44:34Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "1e01082aa602ed390df5c827a4960f823318e737"
  },
  {
   "t": "2026-08-25T06:52:01Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "91b5c0024cc630e4e6c516b0b83529dbc4395c62"
  },
  {
   "t": "2026-08-25T07:07:14Z",
   "kind": "force_push",
   "who": "portlandhodl",
   "commit": "5f7fdc05f62c5ae40a995aaf8e2d4289658cec67"
  }
 ],
 "labels_log": [
  {
   "t": "2023-03-15T10:17:21Z",
   "action": "labeled",
   "label": "RPC/REST/ZMQ",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-18T09:06:36Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-20T00:08:13Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-24T16:57:51Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-07-09T20:43:30Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-07-09T20:44:12Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-07-10T06:43:32Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-07-15T08:29:05Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-07-15T11:45:22Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-07-25T20:17:34Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-07-25T22:43:15Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-08-17T13:51:07Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-09-06T21:22:18Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-09-09T05:09:09Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-09-10T17:14:37Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-09-11T04:41:28Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-09-11T06:52:06Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-09-14T10:44:23Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-09-14T19:14:00Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-09-19T18:15:50Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-09-20T04:18:55Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2023-09-20T04:45:58Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-09-20T06:54:30Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-01-13T13:21:05Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-01-26T23:21:03Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-06-05T04:32:36Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-09-29T08:34:40Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-09-29T09:33:48Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-09-29T11:18:35Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-02-23T09:01:35Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-02-25T12:46:16Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "maflcko"
  },
  {
   "t": "2026-01-08T06:18:40Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-08T07:47:24Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-08T08:37:10Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-03-21T15:53:08Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-03-22T15:17:05Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-03-22T16:05:28Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-25T05:48:59Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-25T08:34:56Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-29T09:09:32Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  }
 ],
 "state_log": [
  {
   "t": "2023-03-16T00:47:39Z",
   "kind": "renamed",
   "who": "portlandhodl",
   "from": "rpc: enhanced error message for invalid network prefix during address parsing.",
   "to": "Enhanced error messages for invalid network prefix during address parsing."
  },
  {
   "t": "2024-06-25T15:45:56Z",
   "kind": "convert_to_draft",
   "who": "fanquake"
  },
  {
   "t": "2024-09-29T08:08:44Z",
   "kind": "ready_for_review",
   "who": "portlandhodl"
  },
  {
   "t": "2025-02-03T11:00:17Z",
   "kind": "convert_to_draft",
   "who": "portlandhodl"
  },
  {
   "t": "2025-02-25T10:50:13Z",
   "kind": "ready_for_review",
   "who": "portlandhodl"
  },
  {
   "t": "2025-05-08T14:27:40Z",
   "kind": "convert_to_draft",
   "who": "portlandhodl"
  },
  {
   "t": "2025-06-04T02:55:35Z",
   "kind": "ready_for_review",
   "who": "portlandhodl"
  },
  {
   "t": "2025-11-07T18:07:29Z",
   "kind": "convert_to_draft",
   "who": "portlandhodl"
  },
  {
   "t": "2026-01-08T10:55:40Z",
   "kind": "ready_for_review",
   "who": "portlandhodl"
  },
  {
   "t": "2026-01-19T12:52:26Z",
   "kind": "convert_to_draft",
   "who": "DrahtBot"
  },
  {
   "t": "2026-03-22T21:28:37Z",
   "kind": "ready_for_review",
   "who": "portlandhodl"
  },
  {
   "t": "2026-05-02T20:23:16Z",
   "kind": "convert_to_draft",
   "who": "sedited"
  }
 ],
 "text_chars": 46318,
 "text_tokens_estimate": 11579,
 "changed_paths": [
  "src/bech32.cpp",
  "src/bech32.h",
  "src/kernel/chainparams.cpp",
  "src/kernel/chainparams.h",
  "src/key_io.cpp",
  "src/test/bech32_tests.cpp",
  "src/test/key_io_tests.cpp",
  "test/functional/data/rpc_validateaddress.json",
  "test/functional/rpc_invalid_address_message.py",
  "test/functional/rpc_validateaddress.py",
  "test/functional/wallet_basic.py"
 ],
 "files": [
  {
   "path": "src/bech32.cpp",
   "add": 14,
   "del": 13
  },
  {
   "path": "src/bech32.h",
   "add": 20,
   "del": 2
  },
  {
   "path": "src/kernel/chainparams.cpp",
   "add": 30,
   "del": 0
  },
  {
   "path": "src/kernel/chainparams.h",
   "add": 3,
   "del": 0
  },
  {
   "path": "src/key_io.cpp",
   "add": 154,
   "del": 103
  },
  {
   "path": "src/test/bech32_tests.cpp",
   "add": 38,
   "del": 38
  },
  {
   "path": "src/test/key_io_tests.cpp",
   "add": 37,
   "del": 3
  },
  {
   "path": "test/functional/data/rpc_validateaddress.json",
   "add": 245,
   "del": 0
  },
  {
   "path": "test/functional/rpc_invalid_address_message.py",
   "add": 20,
   "del": 16
  },
  {
   "path": "test/functional/rpc_validateaddress.py",
   "add": 28,
   "del": 176
  },
  {
   "path": "test/functional/wallet_basic.py",
   "add": 1,
   "del": 1
  }
 ],
 "test_lines": 603,
 "git": {
  "head": "5f7fdc05f62c5ae40a995aaf8e2d4289658cec67",
  "head_matches_backup": true,
  "base": "6a028161dafc5679085e5a039a1dc5189bb26d50",
  "commits": [
   {
    "sha": "a73b675fc1",
    "subject": "chainparams: add human-readable base58 prefix data",
    "files": 3,
    "add": 70,
    "del": 3
   },
   {
    "sha": "e4bf30d8e8",
    "subject": "bech32: return error code enum from LocateErrors",
    "files": 4,
    "add": 92,
    "del": 56
   },
   {
    "sha": "4f018df498",
    "subject": "refactor: split Bech32 and Base58 destination decoding into helpers",
    "files": 1,
    "add": 114,
    "del": 102
   },
   {
    "sha": "f5ec9d5399",
    "subject": "key_io: decode Bech32 upfront, before attempting Base58",
    "files": 3,
    "add": 38,
    "del": 33
   },
   {
    "sha": "ff52dc11d1",
    "subject": "key_io: report mixed-case Bech32 addresses explicitly",
    "files": 2,
    "add": 14,
    "del": 4
   },
   {
    "sha": "3ada26fcb6",
    "subject": "key_io: clarify address decoding error messages",
    "files": 3,
    "add": 37,
    "del": 32
   },
   {
    "sha": "e1bc3a928f",
    "subject": "key_io: list expected prefixes in Base58 wrong-prefix errors",
    "files": 3,
    "add": 10,
    "del": 4
   },
   {
    "sha": "5f7fdc05f6",
    "subject": "test: data-drive rpc_validateaddress and cover signet",
    "files": 2,
    "add": 273,
    "del": 176
   }
  ],
  "patch_truncated": true
 },
 "input_hash": "7022da3f54fbfcd8",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}