{
 "number": 17580,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/17580",
 "title": "refactor: Add ALLOW_LIST flags and enforce usage in CheckArgFlags",
 "author": "ryanofsky",
 "author_association": "MEMBER",
 "created_at": "2019-11-24T20:05:39Z",
 "updated_at": "2026-09-13T15:51:03Z",
 "age_days": 2488,
 "draft": true,
 "labels": [
  "Refactoring"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "06cd45aaf79f8cc91911c27b8624e0aec66108d3",
 "head_ref": "pr/wdlist",
 "head_repo": "ryanofsky/bitcoin",
 "head_history": [
  {
   "t": "2019-12-20T15:23:31Z",
   "sha": "4f3e5e9988280ac96b7979c352da218bbf939ed0"
  },
  {
   "t": "2020-01-24T21:21:03Z",
   "sha": "e42d223d75d37de01f68588e4b495d47daee497b"
  },
  {
   "t": "2020-09-02T20:19:50Z",
   "sha": "9621fae7f267124d7a93409c5320a1113adcbc02"
  },
  {
   "t": "2020-09-25T20:22:14Z",
   "sha": "1fe816edd5ab6a8d495fd6f8f8fda4de4bfeef1a"
  },
  {
   "t": "2020-09-28T11:17:19Z",
   "sha": "3271ee837547f9c6c1d33866ce6d9efb639a7ad3"
  },
  {
   "t": "2020-10-02T15:44:12Z",
   "sha": "678d20b73ded40fe113ecbb6e4df1dc148048aff"
  },
  {
   "t": "2021-04-10T21:19:19Z",
   "sha": "f78c85b7bf5cb3c6029451047e8827bfda0fe285"
  },
  {
   "t": "2021-04-11T19:56:55Z",
   "sha": "a5626386c0da5cd7dc3d685a2ee0f1488cd454c7"
  },
  {
   "t": "2021-06-02T18:47:43Z",
   "sha": "b83d0e0b35a418207b4c7731ebace9c739716551"
  },
  {
   "t": "2021-08-24T02:02:38Z",
   "sha": "601fe2d6f751356836c7bd98441d569c592ea4fe"
  },
  {
   "t": "2021-12-30T20:58:28Z",
   "sha": "71815bc8123c455c5b7cea1bd13534d00e61cde6"
  },
  {
   "t": "2022-09-22T20:39:31Z",
   "sha": "f98d2b012afb7890a56ce1a3462b4eac0b5fff3e"
  },
  {
   "t": "2022-09-24T21:36:00Z",
   "sha": "38db444164058d31e0b23ab863e50691de40a20c"
  },
  {
   "t": "2022-11-29T03:32:00Z",
   "sha": "27685d57acb0604dd670fb6fff9c1e58746cd088"
  },
  {
   "t": "2023-02-14T21:55:36Z",
   "sha": "dd3a716efb72a77e1aff2e89072af5a7caea0ed9"
  },
  {
   "t": "2023-05-03T15:58:18Z",
   "sha": "7e70f985eac4f07dcb74499161961bb75e61866d"
  },
  {
   "t": "2024-07-19T23:06:39Z",
   "sha": "21ba32ad044075b80cfc407d17d0f4d506f9caaa"
  },
  {
   "t": "2024-08-06T15:52:01Z",
   "sha": "a1d65066621a21ea35c4ec8363cfabb862fb5239"
  },
  {
   "t": "2024-12-06T16:13:34Z",
   "sha": "8723b8ed56a03394663945bcdaa00039ccdff5f6"
  },
  {
   "t": "2024-12-06T16:29:01Z",
   "sha": "d2edef6b1a0bde00a29290229a5964e413c49696"
  },
  {
   "t": "2025-03-12T15:19:53Z",
   "sha": "077e20ffba77ec70b89f12df1a7d47c836fb5a67"
  },
  {
   "t": "2025-07-28T20:05:32Z",
   "sha": "8f2544b1be1faaf1932b0fe87e4f52c76a8cdaba"
  },
  {
   "t": "2025-07-31T17:25:30Z",
   "sha": "b7402367abfc8bd3ee3a21205b96e940223c6cdc"
  },
  {
   "t": "2025-07-31T18:20:14Z",
   "sha": "0c5171ff029d1bf871aef1c5a48863ee7aaf0e3a"
  },
  {
   "t": "2025-07-31T21:07:27Z",
   "sha": "973220fe6c55f8bb5c724b0f224c9f1942dde795"
  },
  {
   "t": "2025-08-01T22:43:05Z",
   "sha": "14f3c77fef85eedb5abc5297f4761e587acacd6d"
  },
  {
   "t": "2025-08-01T22:49:07Z",
   "sha": "6e874dee28772b6a9fc1453b029ff2a099d8bfd1"
  },
  {
   "t": "2025-12-12T12:18:45Z",
   "sha": "ed3368c06138f2846d7f27012c866c8bfcbc109f"
  },
  {
   "t": "2025-12-16T02:10:07Z",
   "sha": "b03447e135e56d9ecc4cc1db0da3bfea81098fae"
  },
  {
   "t": "2026-01-18T21:34:47Z",
   "sha": "6f5066238047501d3d9d9f8eb2da7f55f6c32dd7"
  },
  {
   "t": "2026-02-03T20:43:44Z",
   "sha": "0cba02a4883029c5282740790a016a78ea3988da"
  },
  {
   "t": "2026-04-01T20:07:26Z",
   "sha": "c69f5e7bd4a4f04ae4ed9adf0943ae4ef41f3904"
  },
  {
   "t": "2026-06-08T13:39:03Z",
   "sha": "7dd97e17212c05c9332a46a51dfc28ac8543413b"
  },
  {
   "t": "2026-06-24T15:25:20Z",
   "sha": "6feea349c59ce79a964a0fd909d84b1ff76e4867"
  },
  {
   "t": "2026-08-15T01:21:01Z",
   "sha": "06cd45aaf79f8cc91911c27b8624e0aec66108d3"
  }
 ],
 "additions": 1144,
 "deletions": 197,
 "changed_files": 15,
 "commit_count": 14,
 "size_bucket": "XL",
 "mergeable_state": "clean",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {
    "concept_ack": [
     {
      "login": "hebasto",
      "url": "https://github.com/bitcoin/bitcoin/pull/17580#issuecomment-557923507"
     },
     {
      "login": "promag",
      "url": "https://github.com/bitcoin/bitcoin/pull/17580#issuecomment-568306905"
     },
     {
      "login": "ajtowns",
      "url": "https://github.com/bitcoin/bitcoin/pull/17580#pullrequestreview-340279414"
     }
    ]
   },
   "conflicts": [
    {
     "number": 35940,
     "title": "net: allow selecting BIP152 high-bandwidth peers with `-addnode`",
     "author": "w0xlt"
    },
    {
     "number": 35387,
     "title": "logging: make trace logging easily usable",
     "author": "ryanofsky"
    },
    {
     "number": 35322,
     "title": "logging: streamline Logger state and drop redundant methods",
     "author": "ryanofsky"
    },
    {
     "number": 35037,
     "title": "ipc: support per-address max-connections options on -ipcbind",
     "author": "enirox001"
    },
    {
     "number": 35027,
     "title": "net: add -outboundbind option for outgoing source address",
     "author": "8144225309"
    },
    {
     "number": 34038,
     "title": "logging: replace -loglevel with -trace, expose trace logging via RPC",
     "author": "ajtowns"
    },
    {
     "number": 16545,
     "title": "refactor: Implement missing error checking for ArgsManager flags",
     "author": "ryanofsky"
    }
   ]
  }
 },
 "acks_parsed": {
  "hebasto": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2019-11-24T20:14:02Z",
   "stale": false
  },
  "ajtowns": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2020-01-09T05:05:43Z",
   "stale": false
  }
 },
 "acks_tally": {
  "ack": 0,
  "stale_ack": 0,
  "concept_ack": 2,
  "approach_ack": 0,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 0,
  "changes_requested": 0,
  "distinct_reviewers": [
   "ajtowns",
   "fanquake",
   "hebasto",
   "promag"
  ]
 },
 "signals": {
  "needs_rebase": false,
  "ci_failed": false,
  "mergeable_state": "clean",
  "last_author_activity": "2026-08-15T01:21:01Z",
  "last_reviewer_activity": "2023-02-08T11:24:34Z",
  "last_reviewer": "fanquake",
  "author_silent_days": 33,
  "waiting_on_author_days": 0,
  "days_since_update": 4
 },
 "refs": {
  "mentioned": [
   15935,
   16545,
   17493,
   17783,
   18267,
   18309,
   18594,
   19561,
   19709,
   19884,
   19991,
   20685,
   21060,
   21377,
   21710,
   21752,
   22087,
   26489,
   28358,
   30401,
   31223,
   31483,
   32425,
   34267,
   35205,
   35335,
   35441,
   35729
  ],
  "depends_on": [
   16545
  ],
  "fixes": [],
  "linked_issues": [],
  "references": [
   {
    "number": 16545,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "refactor: Implement missing error checking for ArgsManager flags"
   },
   {
    "number": 30401,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2024-09-09",
    "title": "fix: increase consistency of rpcauth parsing"
   },
   {
    "number": 17493,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "util: Forbid ambiguous multiple assignments in config file"
   },
   {
    "number": 15935,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2020-07-23",
    "title": "Add <datadir>/settings.json persistent settings storage"
   },
   {
    "number": 17783,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "common: Disallow calling IsArgSet() on ALLOW_LIST options"
   },
   {
    "number": 18267,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2020-09-21",
    "title": "BIP-325: Signet [consensus]"
   },
   {
    "number": 18309,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2020-10-01",
    "title": "zmq: Add support to listen on multiple interfaces"
   },
   {
    "number": 18594,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2020-05-23",
    "title": "cli: display multiwallet balances in -getinfo"
   },
   {
    "number": 19561,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2020-07-30",
    "title": "refactor: Pass ArgsManager into functions that register args"
   },
   {
    "number": 19709,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2020-08-14",
    "title": "test: Fix 'make cov' with clang"
   },
   {
    "number": 19884,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2021-02-12",
    "title": "p2p: No delay in adding fixed seeds if -dnsseed=0 and peers.dat is empty"
   },
   {
    "number": 19991,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2020-10-02",
    "title": "net: Use alternative port for incoming Tor connections"
   },
   {
    "number": 20685,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2021-03-02",
    "title": "Add I2P support using I2P SAM"
   },
   {
    "number": 21060,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2021-02-03",
    "title": "doc: More precise -debug and -debugexclude doc"
   },
   {
    "number": 21377,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2021-04-15",
    "title": "Speedy trial support for versionbits"
   },
   {
    "number": 21710,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2021-05-05",
    "title": "doc: update helps for addnode rpc and -addnode/-maxconnections config options"
   },
   {
    "number": 21752,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2021-05-11",
    "title": "doc: Clarify that feerates are per virtual size"
   },
   {
    "number": 22087,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2022-10-12",
    "title": "Validate port-options"
   },
   {
    "number": 26489,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2022-11-15",
    "title": "test: Split overly large util_tests.cpp file"
   },
   {
    "number": 28358,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2024-09-16",
    "title": "Drop -dbcache limit"
   },
   {
    "number": 31223,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2024-12-13",
    "title": "net, init: derive default onion port if a user specified a -port"
   },
   {
    "number": 31483,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2025-01-16",
    "title": "kernel: Move kernel-related cache constants to kernel cache"
   },
   {
    "number": 32425,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2025-06-10",
    "title": "config: allow setting -proxy per network"
   },
   {
    "number": 34267,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-01-27",
    "title": "net: avoid unconditional `privatebroadcast` logging (+ warn for debug logs)"
   },
   {
    "number": 35205,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-08-04",
    "title": "kernel,node: add `dbcache` setter and clarify defaults"
   },
   {
    "number": 35335,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-06-03",
    "title": "Make deployment configuration available outside of regtest in unit tests"
   },
   {
    "number": 35441,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-06-15",
    "title": "ci: inline runner selection"
   },
   {
    "number": 35729,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-08-11",
    "title": "refactor: test: Unroll `&&` conditions in macros"
   }
  ],
  "conflicts": [
   35940,
   35387,
   35322,
   35037,
   35027,
   34038,
   16545
  ]
 },
 "stack": {
  "shares_commits_with": [
   17493,
   17581,
   17783
  ],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [
  "src/httprpc.cpp",
  "src/test/util_tests.cpp",
  "src/util/system.cpp"
 ],
 "body": "**This is based on #16545.** The non-base commits are:\n\n- [`4a41fdf89a3` common: Add support for combining ArgsManager flags](https://github.com/bitcoin/bitcoin/pull/17580/commits/4a41fdf89a3eb28bc04440f16c2c2f86c2641166)\n- [`71ceb477320` scripted-diff: Add ALLOW_LIST flag to arguments retrieved with GetArgs](https://github.com/bitcoin/bitcoin/pull/17580/commits/71ceb477320e86f08ec28a66828e5f401111a7af)\n- [`7275db69dd6` refactor: Fix more ALLOW_LIST arguments](https://github.com/bitcoin/bitcoin/pull/17580/commits/7275db69dd6682c9b9eea4fbd87648da4545c404)\n- [`84fda7ff060` Always reject empty -blockfilterindex=\"\" arguments](https://github.com/bitcoin/bitcoin/pull/17580/commits/84fda7ff0608f079ad700f7ab3b0697fe3a25448)\n- [`d7fb7f07fd1` refactor: Stop calling GetArg/IsArgSet on ALLOW_LIST options](https://github.com/bitcoin/bitcoin/pull/17580/commits/d7fb7f07fd16d33551c79830d0cbe96a7a942693)\n- [`da42c7f6671` refactor: Always enforce ALLOW_LIST in CheckArgFlags](https://github.com/bitcoin/bitcoin/pull/17580/commits/da42c7f66715833438a65220eabffe3461884a6d)\n\n---\n\nExcept for two `rpcauth` and `blockfilterindex` fixes (update: rpcauth fix was merged separately in #30401) this PR does not change any behavior outside of tests. It is just supposed to enforce internal consistency and prevent bugs by ensuring that list arguments are always retrieved with GetArgs() and non-list arguments are always retrieved with GetArg(). Followup PRs could use the ALLOW_LIST flags for better documentation and error checking in the future. For example, #17493 builds on this to disallow conflicting config values.\n\nThis change was originally made as part of #17493",
 "commits": [
  {
   "sha": "94300ae454e49d97415848fa144ff19893f53ac1",
   "date": "2026-07-13T20:29:09Z",
   "message": "common: Grammar / formatting tweaks\n\nImplement cleanup suggestions from l0rinc:\n\nhttps://github.com/bitcoin/bitcoin/pull/16545#discussion_r1773221823\nhttps://github.com/bitcoin/bitcoin/pull/16545#discussion_r1773291395\nhttps://github.com/bitcoin/bitcoin/pull/16545#discussion_r1775897382"
  },
  {
   "sha": "92cb734d5a4ed825669f796943229d80a71f7060",
   "date": "2026-07-13T20:29:09Z",
   "message": "doc: Add detailed ArgsManager type flag documention\n\nThis commit just adds documentation for the type flags. The flags are actually\nimplemented in the following two commits."
  },
  {
   "sha": "1500c5801cbb0db12634dd99905845711ffcb8a2",
   "date": "2026-07-13T20:29:09Z",
   "message": "common: Implement ArgsManager flags to parse and validate settings on startup\n\nThis commit implements support for new ALLOW_BOOL, ALLOW_INT, ALLOW_STRING, and\nALLOW_LIST flags by validating settings with these flags earlier on startup and\nproviding detailed error messages to users.\n\nThe new flags implement stricter error checking than ALLOW_ANY. For example, a\ndouble negated option like -nosetting=0 is treated like an error instead of\ntrue, and an unrecognized bool value like -setting=true is treated like an\nerror instead of false. And if a non-list setting is assigned multiple times in\nthe same section of a configuration file, the later assignments trigger errors\ninstead of being silently ignored.\n\nThe new flags also provide type information that allows ArgsManager\nGetSettings() and GetSettingsList() methods to return typed integer and boolean\nvalues instead of unparsed strings.\n\nThe changes in this commit have no effect on current application behavior\nbecause the new flags are only used in unit tests. The existing ALLOW_ANY\nchecks in the argsman_tests/CheckValueTest confirm that no behavior is changing\nfor current settings, which use ALLOW_ANY."
  },
  {
   "sha": "481099679b368be6c707ec536613f356b3543331",
   "date": "2026-07-13T20:29:09Z",
   "message": "common: Update ArgManager GetArg helper methods to work better with ALLOW flags\n\nUpdate GetArg, GetArgs, GetBoolArg, and GetIntArg helper methods to work\nconveniently with ALLOW_BOOL, ALLOW_INT, and ALLOW_STRING flags.\n\nThe GetArg methods are convenience wrappers around the GetSetting method. The\nGetSetting method returns the originally parsed settings values in their\ndeclared bool/int/string types, while the GetArg wrappers provide extra\ntype-coercion and default-value fallback features as additional conveniences\nfor callers.\n\nThis commit makes two changes to GetArg, GetArgs, GetBoolArg, and GetIntArg\nhelper methods when BOOL/INT/STRING flags are used:\n\n1. GetArg methods will now raise errors if they are called with inconsistent\n   flags. For example, GetArgs will raise a logic_error if it is called on a\n   non-LIST setting, GetIntArg will raise a logic_error if it is called\n   on a non-INT setting.\n\n2. GetArg methods will now avoid various type coersion footguns when they are\n   called on new BOOL/INT/STRING settings. Existing ALLOW_ANY settings are\n   unaffected. For example, negated settings will return \"\" empty strings\n   instead of \"0\" strings (in the past the \"0\" strings caused strangeness like\n   \"-nowallet\" options creating wallet files named \"0\"). The new behaviors are\n   fully specified and checked by the `CheckValueTest` unit test.\n\nThe ergonomics of the GetArg helper methods are subjective and the behaviors\nthey implement can be nitpicked and debated endlessly. But behavior of these\nhelper methods does not dictate application behavior, and they can be bypassed\nby calling GetSetting and GetSettingList methods instead. If it's necessary,\nbehavior of these helper methods can also be changed again in the future.\n\nThe changes have no effect on current application behavior because the new\nflags are only used in unit tests. The `setting_args` unit test and ALLOW_ANY\nchecks in the `CheckValueTest` unit test are unchanged and confirm that\n`GetArg` methods behave the same as before for ALLOW_ANY flags (returning the\nsame values and throwing the same exceptions)."
  },
  {
   "sha": "dadfea2ac55a036ab7aa93c6ad14d1f736c8872c",
   "date": "2026-07-13T20:29:09Z",
   "message": "test: Add tests to demonstrate usage of ArgsManager flags\n\nCo-authored-by: Hodlinator <172445034+hodlinator@users.noreply.github.com>"
  },
  {
   "sha": "abe4b1d8974f5171a5e15e2cc5cae2a2144bbb2c",
   "date": "2026-07-13T20:29:09Z",
   "message": "test: Add test for settings.json parsing with type flags\n\nThe type flags aren't currently used to validate or convert settings in the\nsettings.json file, but they should be in the future. Add test to check current\nbehavior that can be extended when flags are applied.\n\nCo-authored-by: Hodlinator <172445034+hodlinator@users.noreply.github.com>"
  },
  {
   "sha": "d134020611f17b6a26809fa31bac88d5a087ea61",
   "date": "2026-08-14T20:01:12Z",
   "message": "Merge branch 'pr/argcheck' into pr/wdlist"
  },
  {
   "sha": "671e54779624f80c7a0e5cb8e913bee2e3966c38",
   "date": "2026-08-14T20:01:12Z",
   "message": "common: Add support for combining ArgsManager flags\n\nLet ALLOW_STRING and ALLOW_INT flags be combined with ALLOW_BOOL so string and\nint options can be specified without explicit values. This is useful for\nimperative settings that trigger new behavior when specified and can accept\noptional string or integer values, but do not require them. (For examples, see\nthe example_options unit test modified in this commit.)"
  },
  {
   "sha": "44e71c8b9f9d688310f660dcb2a37bb55777825e",
   "date": "2026-08-14T20:01:12Z",
   "message": "scripted-diff: Add ALLOW_LIST flag to arguments retrieved with GetArgs\n\nThis change has no effect on behavior, and is basically just a documentation\nchange at this point. The ALLOW_LIST flag is currently ignored unless\nALLOW_BOOL, ALLOW_INT, or ALLOW_STRING flags are also present, and these flags\nare not used yet.\n\n-BEGIN VERIFY SCRIPT-\nfor f in `git grep -n 'GetArgs(' | grep -v _tests | sed -n 's/.*GetArgs(\"\\([^\"]\\+\\)\".*/\\1/p' | sort -u`; do\n   git grep -l -- \"$f\" | xargs sed -i \"/AddArg(\\\"$f[=\\\"]/ s/ArgsManager::ALLOW_ANY/& | ArgsManager::ALLOW_LIST/g\"\ndone\n-END VERIFY SCRIPT-"
  },
  {
   "sha": "bd820336f0b4da310e1921af3da24dac446537ae",
   "date": "2026-08-14T20:01:12Z",
   "message": "refactor: Fix more ALLOW_LIST arguments\n\n- Remove ALLOW_LIST flag from bitcoin-wallet -wallet and -debug arguments. They\n  are list arguments for bitcoind, but single arguments for bitcoin-wallet.\n\n- Add ALLOW_LIST flag to -includeconf arg (missed by scripted diff since it's\n  not accessed through GetArgs)\n\n- Add ALLOW_LIST flag to -proxy, -debug, -loglevel, -whitebind, and -whitelist\n  args (missed by scripted diff due to line breaks in AddArgs calls)\n\n- Add ALLOW_LIST flag to -zmq args (missed by scripted diff due to programmatic\n  GetArgs calls)\n\nThis change has no effect on behavior, and is basically just a documentation\nchange at this point. The ALLOW_LIST flag is currently ignored unless\nALLOW_BOOL, ALLOW_INT, or ALLOW_STRING flags are also present, and these flags\nare not used yet."
  },
  {
   "sha": "b314c7e7de54565649fa24b517f51bfa0f9b723e",
   "date": "2026-08-14T20:01:12Z",
   "message": "Always reject empty -blockfilterindex=\"\" arguments\n\nPrevious behavior was inconsistent: if -blockfilterindex or\n-blockfilterindex=\"\" arguments were specified they would normally enable all\nblock filter indexes, but could also trigger \"Unknown -blockfilterindex value\"\nerrors if followed by later -blockfilterindex arguments.\n\nIt was confusing that the same -blockfilterindex options could sometime trigger\nerrors and sometimes not depending on option position. It was also confusing\nthat an empty -blockfilterindex=\"\" setting could enable all indexes even though\nindexes are disabled by default.\n\nNew behavior is more straightforward:\n\n- -blockfilterindex and -blockfilterindex=1 always enable indexes\n- -noblockfilterindex and -blockfilterindex=0 always disable indexes\n- -blockfilterindex=\"\" is always an unknown value error\n\nThe meaning of these options no longer changes based on option position."
  },
  {
   "sha": "bf58582fd49f0edc9aef6f49117a4d40ea14ea19",
   "date": "2026-08-14T20:01:12Z",
   "message": "refactor: Stop calling GetArg/IsArgSet on ALLOW_LIST options\n\nUpcoming commits will make it an error to call GetArg and IsArgSet methods on\nlist options since these usages are error prone. For example GetArg will return\nlast command line value but first config value in the list, and IsArgSet will\nreturn true even if the list is empty if the list was negated.\n\nThis change is just a refactoring replacing problematic ArgsManager calls with\nequivalent calls to avoid changing any behavior. Current behavior could\nprobably be improved in these cases, but this change should make new problems\nless likely to be introduced."
  },
  {
   "sha": "581eaaf10fc8ce584332fdcc5f04c245f3df7ed2",
   "date": "2026-08-14T20:01:12Z",
   "message": "refactor: Always enforce ALLOW_LIST in CheckArgFlags\n\nPrevent GetArg() from being called on ALLOW_LIST arguments, and GetArgs() from\nbeing called on non-list arguments.\n\nThis checking was previously skipped unless typed INT/BOOL/STRING flags were\npresent, but now it's always done.\n\nThis change has no effect on external behavior. It is just supposed to enforce\ninternal consistency and prevent bugs caused by using the wrong GetArg method\nto retrieve settings."
  },
  {
   "sha": "06cd45aaf79f8cc91911c27b8624e0aec66108d3",
   "date": "2026-08-14T20:01:12Z",
   "message": "test-each-commit: Increase fetch depth\n\nNeeded due to base PR, can be dropped before merge"
  }
 ],
 "timeline": [
  {
   "t": "2019-11-24T20:14:02Z",
   "kind": "comment",
   "who": "hebasto",
   "assoc": "MEMBER",
   "text": "Concept ACK"
  },
  {
   "t": "2019-12-20T15:23:31Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "4f3e5e9988280ac96b7979c352da218bbf939ed0"
  },
  {
   "t": "2019-12-22T22:10:11Z",
   "kind": "comment",
   "who": "promag",
   "assoc": "CONTRIBUTOR",
   "text": "~~Wrong commit bcbbc48a1fe7273494738200d508affef40cb47b?~~ nevermind.\n\nConcept ACK."
  },
  {
   "t": "2020-01-09T04:04:09Z",
   "kind": "review_comment",
   "who": "ajtowns",
   "assoc": "MEMBER",
   "path": "src/util/system.cpp",
   "commit": "6e874dee28772b6a9fc1453b029ff2a099d8bfd1",
   "in_reply_to": null,
   "text": "I don't think it makes sense to ever include any of the `ALLOW_ANY` types in `forbid` (if you don't want a string, then in reality you probably `require` a boolean eg), so having:\n\n```\n  constexpr unsigned int ALLOW_ANY_EQUIV = ALLOW_BOOL | ALLOW_INT | ALLOW_STRING;\n\n  assert((forbid & ALLOW_ANY_EQUIV) == 0);\n  if (*flags & ALLOW_ANY) require &= ~ALLOW_ANY_EQUIV;\n\n  ..\n\n  return (*flags & ALLOW_ANY) == 0; // since ignore_types is gone now\n```\n\nmight make sense?"
  },
  {
   "t": "2020-01-09T04:18:46Z",
   "kind": "review_comment",
   "who": "ajtowns",
   "assoc": "MEMBER",
   "path": "src/test/util_tests.cpp",
   "commit": "6e874dee28772b6a9fc1453b029ff2a099d8bfd1",
   "in_reply_to": null,
   "text": "I think it might be better to restructure the tests than have these special functions that tweak the flags. Maybe something like:\n\n```\nstr_config =\n   \"a=\\n\"\n   \"b=1\\n\"\n   \"c=foo\\n\"\n   \"noaaa=1\\n\"\n   \"r=0\\n\"\n   \"r=1\\n\"\n```\n\n(with a section as well to check overrides/repeats etc work correctly) and then try setting up all the args as `ALLOW_ANY` and check for appropriate errors, then all the args as `ALLOW_BOOL` and check for appropriate results/errors, and all the args as `ALLOW_LIST` and check for appropriate errors?\n\n(Might be nicer to separate out the test infrastructure changes first, so that it's easy to see all the changes to test results in the commit that changes the functionality, but YMMV)"
  },
  {
   "t": "2020-01-09T04:57:40Z",
   "kind": "review_comment",
   "who": "ajtowns",
   "assoc": "MEMBER",
   "path": "src/httprpc.cpp",
   "commit": "6e874dee28772b6a9fc1453b029ff2a099d8bfd1",
   "in_reply_to": null,
   "text": "`gArgs.IsArgSet(\"-rpcauth\")` ?"
  },
  {
   "t": "2020-01-09T05:05:43Z",
   "kind": "review",
   "who": "ajtowns",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "4f3e5e9988280ac96b7979c352da218bbf939ed0",
   "text": "Concept ACK, shame all these checks are happening at runtime rather than compile time though"
  },
  {
   "t": "2020-01-09T20:23:27Z",
   "kind": "review_comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "path": "src/httprpc.cpp",
   "commit": "6e874dee28772b6a9fc1453b029ff2a099d8bfd1",
   "in_reply_to": 364559553,
   "text": "In commit \"refactor: Fix more ALLOW_LIST arguments\" (4bd1c3b1606021dff2b39a1927781b3c53428bbe)\n\n[quoted text omitted]\nThat would do the wrong thing if the argument is negated. `IsArgSet` is generally broken and misused for list settings (and a lot of non-list settings), see #17783"
  },
  {
   "t": "2020-01-09T20:23:37Z",
   "kind": "review_comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "path": "src/test/util_tests.cpp",
   "commit": "6e874dee28772b6a9fc1453b029ff2a099d8bfd1",
   "in_reply_to": 364553512,
   "text": "In commit \"refactor: Always enforce ALLOW_LIST in CheckArgFlags\" (4f3e5e9988280ac96b7979c352da218bbf939ed0)\n\n[quoted text omitted]\nI'm not too inclined to want to restructure the tests, though I'd be happy to review a PR that did. I also wouldn't want to do it in this PR because I'd like the test changes here to reflect only reflect behavior that's changing, and not have other differences."
  },
  {
   "t": "2020-01-09T20:23:44Z",
   "kind": "review_comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "path": "src/util/system.cpp",
   "commit": "6e874dee28772b6a9fc1453b029ff2a099d8bfd1",
   "in_reply_to": 364551281,
   "text": "In commit \"refactor: Always enforce ALLOW_LIST in CheckArgFlags\" (4f3e5e9988280ac96b7979c352da218bbf939ed0):\n\nI see your point that CheckArgFlags is never called forbidding bool/int/string flags, so no need to update `forbid` and probably no reason to even want to, so I could make a simplification along those lines. I think I will at least drop the `forbid &= ~ignore_types` line."
  },
  {
   "t": "2020-01-09T21:10:28Z",
   "kind": "review",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "4bd1c3b1606021dff2b39a1927781b3c53428bbe",
   "text": "Thanks for the review!\n\n[quoted text omitted]\nAgree, but I think adding checks and types like this PR and #17783 are doing is really the hard part. Switching enforcement from runtime to compile time after constraints are in already place would be easier by comparison"
  },
  {
   "t": "2020-01-24T21:21:03Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "e42d223d75d37de01f68588e4b495d47daee497b"
  },
  {
   "t": "2020-01-24T21:23:05Z",
   "kind": "review",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "e42d223d75d37de01f68588e4b495d47daee497b",
   "text": "Updated 4f3e5e9988280ac96b7979c352da218bbf939ed0 -> e42d223d75d37de01f68588e4b495d47daee497b ([`pr/wdlist.2`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.2) -> [`pr/wdlist.3`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.3), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.2..pr/wdlist.3)) with suggested checkargflags simplification\nRebased e42d223d75d37de01f68588e4b495d47daee497b -> 9621fae7f267124d7a93409c5320a1113adcbc02 ([`pr/wdlist.3`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.3) -> [`pr/wdlist.4`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.4), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.3-rebase..pr/wdlist.4)) due to conflicts with #18594, #15935, #19561, #19709 on top of #16545 pr/argcheck.18\nRebased 9621fae7f267124d7a93409c5320a1113adcbc02 -> 1fe816edd5ab6a8d495fd6f8f8fda4de4bfeef1a ([`pr/wdlist.4`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.4) -> [`pr/wdlist.5`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.5), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.4-rebase..pr/wdlist.5)) due to conflict with #18267 on top of #16545 pr/argcheck.18\nUpdated 1fe816edd5ab6a8d495fd6f8f8fda4de4bfeef1a -> 3271ee837547f9c6c1d33866ce6d9efb639a7ad3 ([`pr/wdlist.5`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.5) -> [`pr/wdlist.6`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.6), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.5..pr/wdlist.6)) moving unrelated changes to #17783 on top of #16545 pr/argcheck.18\nRebased 3271ee837547f9c6c1d33866ce6d9efb639a7ad3 -> 678d20b73ded40fe113ecbb6e4df1dc148048aff ([`pr/wdlist.6`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.6) -> [`pr/wdlist.7`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.7), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.6-rebase..pr/wdlist.7)) due to conflicts with #18267, #18309, and #19991 on top of #16545 pr/argcheck.18\nRebased 678d20b73ded40fe113ecbb6e4df1dc148048aff -> f78c85b7bf5cb3c6029451047e8827bfda0fe285 ([`pr/wdlist.7`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.7) -> [`pr/wdlist.8`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.8), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.7-rebase..pr/wdlist.8)) due to conflicts with #19884, #20685, #21060 on top of #16545 pr/argcheck.21\nUpdated f78c85b7bf5cb3c6029451047e8827bfda0fe285 -> a5626386c0da5cd7dc3d685a2ee0f1488cd454c7 ([`pr/wdlist.8`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.8) -> [`pr/wdlist.9`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.9), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.8..pr/wdlist.9)) fixing silent conflicts and CI errors https://cirrus-ci.com/task/5867084006555648 https://cirrus-ci.com/task/4565262239268864\nRebased a5626386c0da5cd7dc3d685a2ee0f1488cd454c7 -> b83d0e0b35a418207b4c7731ebace9c739716551 ([`pr/wdlist.9`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.9) -> [`pr/wdlist.10`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.10), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.9-rebase..pr/wdlist.10)) on top of #16545 pr/argcheck.22 due to conflicts with #21377, #21710, and #21752\nRebased b83d0e0b35a418207b4c7731ebace9c739716551 -> 601fe2d6f751356836c7bd98441d569c592ea4fe ([`pr/wdlist.10`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.10) -> [`pr/wdlist.11`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.11), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.10-rebase..pr/wdlist.11)) on top of #16545 pr/argcheck.25\nRebased 601fe2d6f751356836c7bd98441d569c592ea4fe -> 71815bc8123c455c5b7cea1bd13534d00e61cde6 ([`pr/wdlist.11`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.11) -> [`pr/wdlist.12`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.12), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.11-rebase..pr/wdlist.12)) on top of #16545 pr/argcheck.28\nRebased 71815bc8123c455c5b7cea1bd13534d00e61cde6 -> f98d2b012afb7890a56ce1a3462b4eac0b5fff3e ([`pr/wdlist.12`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.12) -> [`pr/wdlist.13`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.13), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.12-rebase..pr/wdlist.13)) on top of #16545 pr/argcheck.29 and adding new commit to fix new problem with `-blockfilterindex` arguments\nRebased f98d2b012afb7890a56ce1a3462b4eac0b5fff3e -> 38db444164058d31e0b23ab863e50691de40a20c ([`pr/wdlist.13`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.13) -> [`pr/wdlist.14`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.14), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.13-rebase..pr/wdlist.14)) on top of #16545 pr/argcheck.30 to fix signed integer conversion https://cirrus-ci.com/task/5371023720710144\nRebased 38db444164058d31e0b23ab863e50691de40a20c -> 27685d57acb0604dd670fb6fff9c1e58746cd088 ([`pr/wdlist.14`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.14) -> [`pr/wdlist.15`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.15), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.14-rebase..pr/wdlist.15)) due to conflicts with #22087 and #26489"
  },
  {
   "t": "2020-09-02T20:19:50Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "9621fae7f267124d7a93409c5320a1113adcbc02"
  },
  {
   "t": "2020-09-25T20:22:14Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "1fe816edd5ab6a8d495fd6f8f8fda4de4bfeef1a"
  },
  {
   "t": "2020-09-28T11:17:19Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "3271ee837547f9c6c1d33866ce6d9efb639a7ad3"
  },
  {
   "t": "2020-10-02T15:44:12Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "678d20b73ded40fe113ecbb6e4df1dc148048aff"
  },
  {
   "t": "2021-04-10T21:19:19Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "f78c85b7bf5cb3c6029451047e8827bfda0fe285"
  },
  {
   "t": "2021-04-11T19:56:55Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "a5626386c0da5cd7dc3d685a2ee0f1488cd454c7"
  },
  {
   "t": "2021-06-02T18:47:43Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "b83d0e0b35a418207b4c7731ebace9c739716551"
  },
  {
   "t": "2021-08-24T02:02:38Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "601fe2d6f751356836c7bd98441d569c592ea4fe"
  },
  {
   "t": "2021-12-30T20:58:28Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "71815bc8123c455c5b7cea1bd13534d00e61cde6"
  },
  {
   "t": "2022-09-22T20:39:31Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "f98d2b012afb7890a56ce1a3462b4eac0b5fff3e"
  },
  {
   "t": "2022-09-24T21:36:00Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "38db444164058d31e0b23ab863e50691de40a20c"
  },
  {
   "t": "2022-11-29T03:32:00Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "27685d57acb0604dd670fb6fff9c1e58746cd088"
  },
  {
   "t": "2023-02-08T11:24:34Z",
   "kind": "comment",
   "who": "fanquake",
   "assoc": "MEMBER",
   "text": "Moved this to draft for now, given it's based on another PR, which itself is a draft."
  },
  {
   "t": "2023-02-14T21:55:36Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "dd3a716efb72a77e1aff2e89072af5a7caea0ed9"
  },
  {
   "t": "2023-05-03T15:58:18Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "7e70f985eac4f07dcb74499161961bb75e61866d"
  },
  {
   "t": "2024-07-19T23:06:39Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "21ba32ad044075b80cfc407d17d0f4d506f9caaa"
  },
  {
   "t": "2024-08-06T15:52:01Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "a1d65066621a21ea35c4ec8363cfabb862fb5239"
  },
  {
   "t": "2024-12-06T16:13:34Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "8723b8ed56a03394663945bcdaa00039ccdff5f6"
  },
  {
   "t": "2024-12-06T16:21:09Z",
   "kind": "comment",
   "who": "ryanofsky",
   "assoc": "MEMBER",
   "text": "Dropping commit 811670650471b352b5e0755e6f38b85154c2bfb3 which is no longer needed after #30401\n\nRebased a1d65066621a21ea35c4ec8363cfabb862fb5239 -> 8723b8ed56a03394663945bcdaa00039ccdff5f6 ([`pr/wdlist.19`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.19) -> [`pr/wdlist.20`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.20), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.19-rebase..pr/wdlist.20)) due to various conflicts\nUpdated 8723b8ed56a03394663945bcdaa00039ccdff5f6 -> d2edef6b1a0bde00a29290229a5964e413c49696 ([`pr/wdlist.20`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.20) -> [`pr/wdlist.21`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.21), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.20..pr/wdlist.21)) adding commit da3bdd5f00b3dcd380b7bd67d2d54ec7c4b9c2bb which previously was part of base PR #16545 but was dropped there to make review easier. This functionality in this commit is needed for the -blockfilterindex argument\nRebased d2edef6b1a0bde00a29290229a5964e413c49696 -> 077e20ffba77ec70b89f12df1a7d47c836fb5a67 ([`pr/wdlist.21`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.21) -> [`pr/wdlist.22`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.22), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.21-rebase..pr/wdlist.22)) due to conflicts with #28358, #31223, and #31483\nRebased 077e20ffba77ec70b89f12df1a7d47c836fb5a67 -> 8f2544b1be1faaf1932b0fe87e4f52c76a8cdaba ([`pr/wdlist.22`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.22) -> [`pr/wdlist.23`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.23), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.22-rebase..pr/wdlist.23)) due to conflicts\nUpdated 8f2544b1be1faaf1932b0fe87e4f52c76a8cdaba -> b7402367abfc8bd3ee3a21205b96e940223c6cdc ([`pr/wdlist.23`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.23) -> [`pr/wdlist.24`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.24), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.23..pr/wdlist.24)) due to silent conflict with #32425\nUpdated b7402367abfc8bd3ee3a21205b96e940223c6cdc -> 0c5171ff029d1bf871aef1c5a48863ee7aaf0e3a ([`pr/wdlist.24`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.24) -> [`pr/wdlist.25`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.25), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.24..pr/wdlist.25)) to fix wallet tool test failure cause by bad conflict resolution in push before last\nRebased 0c5171ff029d1bf871aef1c5a48863ee7aaf0e3a -> 973220fe6c55f8bb5c724b0f224c9f1942dde795 ([`pr/wdlist.25`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.25) -> [`pr/wdlist.26`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.26), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.25-rebase..pr/wdlist.26)) to fix for-each-commit merge errors\nUpdated 973220fe6c55f8bb5c724b0f224c9f1942dde795 -> 14f3c77fef85eedb5abc5297f4761e587acacd6d ([`pr/wdlist.26`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.26) -> [`pr/wdlist.27`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.27), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.26..pr/wdlist.27)) adding another -proxy fix for #17783\n\nRebased 14f3c77fef85eedb5abc5297f4761e587acacd6d -> 6e874dee28772b6a9fc1453b029ff2a099d8bfd1 ([`pr/wdlist.27`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.27) -> [`pr/wdlist.28`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.28), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.27-rebase..pr/wdlist.28)) due to for-each-commit merge error https://github.com/bitcoin/bitcoin/actions/runs/16686593625/job/47237155434?pr=17580\n\nRebased 6e874dee28772b6a9fc1453b029ff2a099d8bfd1 -> ed3368c06138f2846d7f27012c866c8bfcbc109f ([`pr/wdlist.28`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.28) -> [`pr/wdlist.29`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.29), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.28-rebase..pr/wdlist.29))\n\nRebased ed3368c06138f2846d7f27012c866c8bfcbc109f -> b03447e135e56d9ecc4cc1db0da3bfea81098fae ([`pr/wdlist.29`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.29) -> [`pr/wdlist.30`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.30), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.29-rebase..pr/wdlist.30))\n\nRebased b03447e135e56d9ecc4cc1db0da3bfea81098fae -> 6f5066238047501d3d9d9f8eb2da7f55f6c32dd7 ([`pr/wdlist.30`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.30) -> [`pr/wdlist.31`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.31), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.30-rebase..pr/wdlist.31)) on top of #16545 pr/argcheck.50\n\nRebased 6f5066238047501d3d9d9f8eb2da7f55f6c32dd7 -> d96eb990a42c5e89d156881b417075807b8b38a5 ([`pr/wdlist.31`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.31) -> [`pr/wdlist.32`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.32), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.31-rebase..pr/wdlist.32)) due to conflict with #34267\n\nRebased d96eb990a42c5e89d156881b417075807b8b38a5 -> c69f5e7bd4a4f04ae4ed9adf0943ae4ef41f3904 ([`pr/wdlist.32`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.32) -> [`pr/wdlist.33`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.33), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.32-rebase..pr/wdlist.33)) on top of pr/argcheck.54\n\nRebased c69f5e7bd4a4f04ae4ed9adf0943ae4ef41f3904 -> 7ff7596b4a5e3ea1ecc54791b046ebe7f865f9f7 ([`pr/wdlist.33`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.33) -> [`pr/wdlist.34`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.34), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.33-rebase..pr/wdlist.34)) on top of #16545 pr/argcheck.54 due to conflict with #35335\n\nRebased 7ff7596b4a5e3ea1ecc54791b046ebe7f865f9f7 -> da42c7f66715833438a65220eabffe3461884a6d ([`pr/wdlist.34`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.34) -> [`pr/wdlist.35`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.35), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.34-rebase..pr/wdlist.35)) due to conflict with #35441\n\nRebased da42c7f66715833438a65220eabffe3461884a6d -> 581eaaf10fc8ce584332fdcc5f04c245f3df7ed2 ([`pr/wdlist.35`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.35) -> [`pr/wdlist.36`](https://github.com/ryanofsky/bitcoin/commits/pr/wdlist.36), [compare](https://github.com/ryanofsky/bitcoin/compare/pr/wdlist.35-rebase..pr/wdlist.36)) due to conflicts with #35205 and #35729"
  },
  {
   "t": "2024-12-06T16:29:01Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "d2edef6b1a0bde00a29290229a5964e413c49696"
  },
  {
   "t": "2025-03-12T15:19:53Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "077e20ffba77ec70b89f12df1a7d47c836fb5a67"
  },
  {
   "t": "2025-07-28T20:05:32Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "8f2544b1be1faaf1932b0fe87e4f52c76a8cdaba"
  },
  {
   "t": "2025-07-31T17:25:30Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "b7402367abfc8bd3ee3a21205b96e940223c6cdc"
  },
  {
   "t": "2025-07-31T18:20:14Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "0c5171ff029d1bf871aef1c5a48863ee7aaf0e3a"
  },
  {
   "t": "2025-07-31T21:07:27Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "973220fe6c55f8bb5c724b0f224c9f1942dde795"
  },
  {
   "t": "2025-08-01T22:43:05Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "14f3c77fef85eedb5abc5297f4761e587acacd6d"
  },
  {
   "t": "2025-08-01T22:49:07Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "6e874dee28772b6a9fc1453b029ff2a099d8bfd1"
  },
  {
   "t": "2025-12-12T12:18:45Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "ed3368c06138f2846d7f27012c866c8bfcbc109f"
  },
  {
   "t": "2025-12-16T02:10:07Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "b03447e135e56d9ecc4cc1db0da3bfea81098fae"
  },
  {
   "t": "2026-01-18T21:34:47Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "6f5066238047501d3d9d9f8eb2da7f55f6c32dd7"
  },
  {
   "t": "2026-02-03T20:43:44Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "0cba02a4883029c5282740790a016a78ea3988da"
  },
  {
   "t": "2026-04-01T20:07:26Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "c69f5e7bd4a4f04ae4ed9adf0943ae4ef41f3904"
  },
  {
   "t": "2026-06-08T13:39:03Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "7dd97e17212c05c9332a46a51dfc28ac8543413b"
  },
  {
   "t": "2026-06-24T15:25:20Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "6feea349c59ce79a964a0fd909d84b1ff76e4867"
  },
  {
   "t": "2026-08-15T01:21:01Z",
   "kind": "force_push",
   "who": "ryanofsky",
   "commit": "06cd45aaf79f8cc91911c27b8624e0aec66108d3"
  }
 ],
 "labels_log": [
  {
   "t": "2019-11-24T20:16:57Z",
   "action": "labeled",
   "label": "Refactoring",
   "who": "fanquake"
  },
  {
   "t": "2019-12-19T20:15:33Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2019-12-20T16:53:43Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-01-30T22:50:42Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-09-02T20:43:39Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-09-15T15:51:10Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-09-25T20:27:32Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-09-29T07:59:52Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-10-02T15:51:51Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2020-10-29T14:21:16Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-04-10T21:49:44Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-04-15T04:01:30Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-06-02T19:44:23Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-08-22T01:58:53Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2021-12-30T21:32:53Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-02-09T23:11:29Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-09-22T21:26:39Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-11-15T21:17:19Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2022-11-29T04:10:27Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-01-11T13:56:00Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-02-15T00:13:14Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-03-20T18:46:38Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-03T17:00:50Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2023-05-09T16:37:47Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-20T00:28:33Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-05T01:42:09Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-06T18:00:22Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-07T22:12:32Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-06T16:29:21Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-06T17:17:07Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-06T17:59:26Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-12-14T01:18:09Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-12T16:23:13Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-14T01:36:12Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-07-28T20:26:46Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-07-29T01:30:10Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-07-31T23:17:52Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-11-21T23:34:37Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-12T13:18:48Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-12T18:36:21Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-18T22:52:07Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-27T13:51:44Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-03T22:13:48Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-03T22:20:45Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-04T01:24:07Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-19T02:40:29Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-04-01T20:30:48Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-03T22:30:27Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-08T15:19:05Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-15T21:43:02Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-24T16:05:49Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-04T20:50:56Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-15T02:51:32Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  }
 ],
 "state_log": [
  {
   "t": "2023-02-08T11:24:24Z",
   "kind": "convert_to_draft",
   "who": "fanquake"
  }
 ],
 "text_chars": 24717,
 "text_tokens_estimate": 6179,
 "changed_paths": [
  ".github/workflows/ci.yml",
  "src/chainparamsbase.cpp",
  "src/common/args.cpp",
  "src/common/args.h",
  "src/common/config.cpp",
  "src/init.cpp",
  "src/init/common.cpp",
  "src/test/argsman_tests.cpp",
  "src/test/fuzz/system.cpp",
  "src/test/getarg_tests.cpp",
  "src/test/logging_tests.cpp",
  "src/test/util/common.h",
  "src/wallet/init.cpp",
  "test/functional/feature_config_args.py",
  "test/lint/check-doc.py"
 ],
 "files": [
  {
   "path": ".github/workflows/ci.yml",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/chainparamsbase.cpp",
   "add": 4,
   "del": 4
  },
  {
   "path": "src/common/args.cpp",
   "add": 158,
   "del": 49
  },
  {
   "path": "src/common/args.h",
   "add": 162,
   "del": 21
  },
  {
   "path": "src/common/config.cpp",
   "add": 4,
   "del": 0
  },
  {
   "path": "src/init.cpp",
   "add": 44,
   "del": 36
  },
  {
   "path": "src/init/common.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/test/argsman_tests.cpp",
   "add": 648,
   "del": 66
  },
  {
   "path": "src/test/fuzz/system.cpp",
   "add": 47,
   "del": 7
  },
  {
   "path": "src/test/getarg_tests.cpp",
   "add": 61,
   "del": 3
  },
  {
   "path": "src/test/logging_tests.cpp",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/test/util/common.h",
   "add": 4,
   "del": 0
  },
  {
   "path": "src/wallet/init.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/feature_config_args.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/lint/check-doc.py",
   "add": 3,
   "del": 2
  }
 ],
 "test_lines": 849,
 "git": {
  "head": "06cd45aaf79f8cc91911c27b8624e0aec66108d3",
  "head_matches_backup": true,
  "base": "683e05a265c86fee6075ccd81828b19e0d8e131a",
  "commits": [
   {
    "sha": "94300ae454",
    "subject": "common: Grammar / formatting tweaks",
    "files": 2,
    "add": 4,
    "del": 4
   },
   {
    "sha": "92cb734d5a",
    "subject": "doc: Add detailed ArgsManager type flag documention",
    "files": 2,
    "add": 137,
    "del": 18
   },
   {
    "sha": "1500c5801c",
    "subject": "common: Implement ArgsManager flags to parse and validate settings on startup",
    "files": 5,
    "add": 194,
    "del": 16
   },
   {
    "sha": "481099679b",
    "subject": "common: Update ArgManager GetArg helper methods to work better with ALLOW flags",
    "files": 4,
    "add": 174,
    "del": 80
   },
   {
    "sha": "dadfea2ac5",
    "subject": "test: Add tests to demonstrate usage of ArgsManager flags",
    "files": 2,
    "add": 312,
    "del": 0
   },
   {
    "sha": "abe4b1d897",
    "subject": "test: Add test for settings.json parsing with type flags",
    "files": 1,
    "add": 61,
    "del": 3
   },
   {
    "sha": "d134020611",
    "subject": "Merge branch 'pr/argcheck' into pr/wdlist",
    "files": 9,
    "add": 851,
    "del": 90
   },
   {
    "sha": "671e547796",
    "subject": "common: Add support for combining ArgsManager flags",
    "files": 4,
    "add": 138,
    "del": 20
   },
   {
    "sha": "44e71c8b9f",
    "subject": "scripted-diff: Add ALLOW_LIST flag to arguments retrieved with GetArgs",
    "files": 6,
    "add": 27,
    "del": 27
   },
   {
    "sha": "bd820336f0",
    "subject": "refactor: Fix more ALLOW_LIST arguments",
    "files": 3,
    "add": 13,
    "del": 13
   },
   {
    "sha": "b314c7e7de",
    "subject": "Always reject empty -blockfilterindex=\"\" arguments",
    "files": 1,
    "add": 8,
    "del": 7
   },
   {
    "sha": "bf58582fd4",
    "subject": "refactor: Stop calling GetArg/IsArgSet on ALLOW_LIST options",
    "files": 1,
    "add": 11,
    "del": 4
   },
   {
    "sha": "581eaaf10f",
    "subject": "refactor: Always enforce ALLOW_LIST in CheckArgFlags",
    "files": 3,
    "add": 121,
    "del": 61
   },
   {
    "sha": "06cd45aaf7",
    "subject": "test-each-commit: Increase fetch depth",
    "files": 1,
    "add": 1,
    "del": 1
   }
  ],
  "patch_truncated": true
 },
 "input_hash": "68592e2e046cb451",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}