{
 "number": 36489,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/36489",
 "title": "wallet: rpc: Add snake_case aliases for wallet funding options",
 "author": "maflcko",
 "author_association": "MEMBER",
 "created_at": "2026-10-09T11:35:56Z",
 "updated_at": "2026-10-26T09:13:12Z",
 "description_hash": "4eeaab464e73a4ca",
 "age_days": 23,
 "draft": false,
 "labels": [
  "Wallet"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "faeb073ca68348bc663c80b3f2b70d7014466b07",
 "head_ref": "2610-rpc-wallet-fund-alias-snake-case",
 "head_repo": "maflcko/bitcoin-core",
 "head_history": [
  {
   "t": "2026-10-09T12:30:37Z",
   "sha": "fa4cb81fd069966d22accbc0b71c0d923f0f086f"
  },
  {
   "t": "2026-10-09T12:45:21Z",
   "sha": "faeb073ca68348bc663c80b3f2b70d7014466b07"
  }
 ],
 "additions": 54,
 "deletions": 18,
 "changed_files": 7,
 "commit_count": 2,
 "size_bucket": "S",
 "mergeable_state": "clean",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {
    "ack": [
     {
      "login": "Conradgabe",
      "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6121356827"
     }
    ],
    "concept_ack": [
     {
      "login": "psychemist",
      "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6084746784"
     },
     {
      "login": "kevkevinpal",
      "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6098272996"
     }
    ]
   },
   "conflicts": []
  }
 },
 "acks_parsed": {
  "psychemist": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2026-10-09T16:14:39Z",
   "stale": false
  },
  "kevkevinpal": {
   "kind": "concept_ack",
   "hash": null,
   "t": "2026-10-10T14:01:34Z",
   "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": [
   "Conradgabe",
   "fametrano",
   "kevkevinpal",
   "psychemist"
  ]
 },
 "signals": {
  "needs_rebase": false,
  "ci_failed": false,
  "mergeable_state": "clean",
  "last_author_activity": "2026-10-26T09:13:12Z",
  "last_reviewer_activity": "2026-10-25T06:47:09Z",
  "last_reviewer": "fametrano",
  "author_silent_days": 6,
  "waiting_on_author_days": 0,
  "days_since_update": 6
 },
 "refs": {
  "mentioned": [
   36488
  ],
  "depends_on": [],
  "fixes": [],
  "linked_issues": [],
  "references": [
   {
    "number": 36488,
    "type": "pull",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "rpc: wallet: Schedule mixed-case confTarget option deprecation"
   }
  ],
  "conflicts": []
 },
 "stack": {
  "shares_commits_with": [],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [
  "doc/release-notes-36489.md",
  "src/rpc/client.cpp"
 ],
 "body": "The options for wallet funding RPCs have several issues:\n\n* snake_case aliases are accepted by the server, but unsupported by bitcoin-cli, not mentioned in the docs and rejected by the schema.\n* If both the snake_case and camelCase are provided, the camelCase is silently ignored.\n* The server silently ignores `subtract_fee_from_outputs`. (reported by stutxo in https://github.com/bitcoin/bitcoin/pull/35317)\n\nFix all issues, by:\n\n* Adding the snake_case aliases to the CLI, docs and the schema.\n* Rejecting if both are supplied.\n* Reading `subtract_fee_from_outputs` instead of silently ignoring it.",
 "commits": [
  {
   "sha": "fac8ef10f4c618136dd318f642fd7ccb4587d509",
   "date": "2026-10-09T12:45:00Z",
   "message": "wallet: rpc: Add snake_case aliases for wallet funding options"
  },
  {
   "sha": "faeb073ca68348bc663c80b3f2b70d7014466b07",
   "date": "2026-10-09T12:45:11Z",
   "message": "test: Use new named arg aliases in tests\n\nWith the prior commit reverted, the tests here would all fail with\n(-8) Unknown named parameter ..."
  }
 ],
 "timeline": [
  {
   "t": "2026-10-09T12:30:37Z",
   "kind": "force_push",
   "who": "maflcko",
   "commit": "fa4cb81fd069966d22accbc0b71c0d923f0f086f",
   "id": "push:fa4cb81fd069966d22accbc0b71c0d923f0f086f"
  },
  {
   "t": "2026-10-09T12:45:21Z",
   "kind": "force_push",
   "who": "maflcko",
   "commit": "faeb073ca68348bc663c80b3f2b70d7014466b07",
   "id": "push:faeb073ca68348bc663c80b3f2b70d7014466b07"
  },
  {
   "t": "2026-10-09T13:22:50Z",
   "kind": "comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "text": "The redered diff:\n\nschema and doc diff\n\n```diff\ndiff --git a/fundrawtransaction b/fundrawtransaction\nindex fa5e2a7..e0dff59 100644\n--- a/fundrawtransaction\n+++ b/fundrawtransaction\n@@ -2,7 +2,7 @@ fundrawtransaction \"hexstring\" ( options iswitness )\n\n If the transaction has no inputs, they will be automatically selected to meet its out value.\n It will add at most one change output to the outputs.\n-No existing outputs will be modified unless \"subtractFeeFromOutputs\" is specified.\n+No existing outputs will be modified unless \"subtract_fee_from_outputs\" is specified.\n Note that inputs which were signed may need to be resigned after completion since in/outputs have been added.\n The inputs added will not be signed, use signrawtransactionwithkey\n or signrawtransactionwithwallet for that.\n@@ -32,14 +32,14 @@ include_unsafe             (boolean, optional, default=false) Include inputs tha\n                              If that happens, you will need to fund the transaction with different inputs and republish it.\n minconf                      (numeric, optional, default=0) If add_inputs is specified, require inputs with at least this many confirmations.\n maxconf                      (numeric, optional) If add_inputs is specified, require inputs with at most this many confirmations.\n-changeAddress              (string, optional, default=automatic) The bitcoin address to receive the change\n-changePosition             (numeric, optional, default=random) The index of the change output\n+change_address               (string, optional, default=automatic) The bitcoin address to receive the change\n+change_position              (numeric, optional, default=random) The index of the change output\n change_type                  (string, optional, default=set by -changetype) The output type to use. Only valid if changeAddress is not specified. Options are \"legacy\", \"p2sh-segwit\", \"bech32\", \"bech32m\".\n includeWatching              (boolean, optional, default=false) (DEPRECATED) No longer used\n-lockUnspents               (boolean, optional, default=false) Lock selected unspent outputs\n+lock_unspents                (boolean, optional, default=false) Lock selected unspent outputs\n fee_rate                     (numeric or string, optional, default=not set, fall back to wallet fee estimation) Specify a fee rate in sat/vB.\n feeRate                      (numeric or string, optional, default=not set, fall back to wallet fee estimation) Specify a fee rate in BTC/kvB.\n-subtractFeeFromOutputs     (json array, optional, default=[]) The integers.\n+subtract_fee_from_outputs    (json array, optional, default=[]) The output indices to subtract the fee from.\n                              The fee will be equally deducted from the amount of each specified output.\n                              Those recipients will receive less bitcoins than you enter in their corresponding amount field.\n                              If no outputs are specified here, the sender pays the fee.\ndiff --git a/getopenrpcinfo.full.json b/getopenrpcinfo.full.json\nindex 4524013..ad0d73d 100644\n--- a/getopenrpcinfo.full.json\n+++ b/getopenrpcinfo.full.json\n@@ -3120,7 +3120,7 @@\n         },\n         {\n             \"name\": \"fundrawtransaction\",\n-            \"description\": \"If the transaction has no inputs, they will be automatically selected to meet its out value.\\nIt will add at most one change output to the outputs.\\nNo existing outputs will be modified unless \\\"subtractFeeFromOutputs\\\" is specified.\\nNote that inputs which were signed may need to be resigned after completion since in/outputs have been added.\\nThe inputs added will not be signed, use signrawtransactionwithkey\\nor signrawtransactionwithwallet for that.\\nAll existing inputs must either have their previous output transaction be in the wallet\\nor be in the UTXO set. Solving data must be provided for non-wallet inputs.\\nNote that all inputs selected must be of standard form and P2SH scripts must be\\nin the wallet using importdescriptors (to calculate fees).\\nYou can see whether this is the case by checking the \\\"solvable\\\" field in the listunspent output.\\nNote that if specifying an exact fee rate, the resulting transaction may have a higher fee rate\\nif the transaction has unconfirmed inputs. This is because the wallet will attempt to make the\\nentire package have the given fee rate, not the resulting transaction.\",\n+            \"description\": \"If the transaction has no inputs, they will be automatically selected to meet its out value.\\nIt will add at most one change output to the outputs.\\nNo existing outputs will be modified unless \\\"subtract_fee_from_outputs\\\" is specified.\\nNote that inputs which were signed may need to be resigned after completion since in/outputs have been added.\\nThe inputs added will not be signed, use signrawtransactionwithkey\\nor signrawtransactionwithwallet for that.\\nAll existing inputs must either have their previous output transaction be in the wallet\\nor be in the UTXO set. Solving data must be provided for non-wallet inputs.\\nNote that all inputs selected must be of standard form and P2SH scripts must be\\nin the wallet using importdescriptors (to calculate fees).\\nYou can see whether this is the case by checking the \\\"solvable\\\" field in the listunspent output.\\nNote that if specifying an exact fee rate, the resulting transaction may have a higher fee rate\\nif the transaction has unconfirmed inputs. This is because the wallet will attempt to make the\\nentire package have the given fee rate, not the resulting transaction.\",\n             \"params\": [\n                 {\n                     \"name\": \"hexstring\",\n@@ -3156,12 +3156,12 @@\n                                 \"type\": \"number\",\n                                 \"description\": \"If add_inputs is specified, require inputs with at most this many confirmations.\"\n                             },\n-                            \"changeAddress\": {\n+                            \"change_address\": {\n                                 \"type\": \"string\",\n                                 \"x-bitcoin-default-hint\": \"automatic\",\n                                 \"description\": \"The bitcoin address to receive the change\"\n                             },\n-                            \"changePosition\": {\n+                            \"change_position\": {\n                                 \"type\": \"number\",\n                                 \"x-bitcoin-default-hint\": \"random\",\n                                 \"description\": \"The index of the change output\"\n@@ -3176,7 +3176,7 @@\n                                 \"default\": false,\n                                 \"description\": \"(DEPRECATED) No longer used\"\n                             },\n-                            \"lockUnspents\": {\n+                            \"lock_unspents\": {\n                                 \"type\": \"boolean\",\n                                 \"default\": false,\n                                 \"description\": \"Lock selected unspent outputs\"\n@@ -3205,13 +3205,13 @@\n                                 \"x-bitcoin-default-hint\": \"not set, fall back to wallet fee estimation\",\n                                 \"description\": \"Specify a fee rate in BTC/kvB.\"\n                             },\n-                            \"subtractFeeFromOutputs\": {\n+                            \"subtract_fee_from_outputs\": {\n                                 \"type\": \"array\",\n                                 \"items\": {\n                                     \"type\": \"number\"\n                                 },\n                                 \"default\": [],\n-                                \"description\": \"The integers.\\nThe fee will be equally deducted from the amount of each specified output.\\nThose recipients will receive less bitcoins than you enter in their corresponding amount field.\\nIf no outputs are specified here, the sender pays the fee.\"\n+                                \"description\": \"The output indices to subtract the fee from.\\nThe fee will be equally deducted from the amount of each specified output.\\nThose recipients will receive less bitcoins than you enter in their corresponding amount field.\\nIf no outputs are specified here, the sender pays the fee.\"\n                             },\n                             \"input_weights\": {\n                                 \"type\": \"array\",\n@@ -15380,12 +15380,12 @@\n                                 \"type\": \"number\",\n                                 \"description\": \"If add_inputs is specified, require inputs with at most this many confirmations.\"\n                             },\n-                            \"changeAddress\": {\n+                            \"change_address\": {\n                                 \"type\": \"string\",\n                                 \"x-bitcoin-default-hint\": \"automatic\",\n                                 \"description\": \"The bitcoin address to receive the change\"\n                             },\n-                            \"changePosition\": {\n+                            \"change_position\": {\n                                 \"type\": \"number\",\n                                 \"x-bitcoin-default-hint\": \"random\",\n                                 \"description\": \"The index of the change output\"\n@@ -15400,7 +15400,7 @@\n                                 \"default\": false,\n                                 \"description\": \"(DEPRECATED) No longer used\"\n                             },\n-                            \"lockUnspents\": {\n+                            \"lock_unspents\": {\n                                 \"type\": \"boolean\",\n                                 \"default\": false,\n                                 \"description\": \"Lock selected unspent outputs\"\n@@ -15429,7 +15429,7 @@\n                                 \"x-bitcoin-default-hint\": \"not set, fall back to wallet fee estimation\",\n                                 \"description\": \"Specify a fee rate in BTC/kvB.\"\n                             },\n-                            \"subtractFeeFromOutputs\": {\n+                            \"subtract_fee_from_outputs\": {\n                                 \"type\": \"array\",\n                                 \"items\": {\n                                     \"type\": \"number\"\ndiff --git a/walletcreatefundedpsbt b/walletcreatefundedpsbt\nindex f73e096..aee80c4 100644\n--- a/walletcreatefundedpsbt\n+++ b/walletcreatefundedpsbt\n@@ -46,14 +46,14 @@ include_unsafe             (boolean, optional, default=false) Include inputs tha\n                              If that happens, you will need to fund the transaction with different inputs and republish it.\n minconf                      (numeric, optional, default=0) If add_inputs is specified, require inputs with at least this many confirmations.\n maxconf                      (numeric, optional) If add_inputs is specified, require inputs with at most this many confirmations.\n-changeAddress              (string, optional, default=automatic) The bitcoin address to receive the change\n-changePosition             (numeric, optional, default=random) The index of the change output\n+change_address               (string, optional, default=automatic) The bitcoin address to receive the change\n+change_position              (numeric, optional, default=random) The index of the change output\n change_type                  (string, optional, default=set by -changetype) The output type to use. Only valid if changeAddress is not specified. Options are \"legacy\", \"p2sh-segwit\", \"bech32\", \"bech32m\".\n includeWatching              (boolean, optional, default=false) (DEPRECATED) No longer used\n-lockUnspents               (boolean, optional, default=false) Lock selected unspent outputs\n+lock_unspents                (boolean, optional, default=false) Lock selected unspent outputs\n fee_rate                     (numeric or string, optional, default=not set, fall back to wallet fee estimation) Specify a fee rate in sat/vB.\n feeRate                      (numeric or string, optional, default=not set, fall back to wallet fee estimation) Specify a fee rate in BTC/kvB.\n-subtractFeeFromOutputs     (json array, optional, default=[]) The outputs to subtract the fee from.\n+subtract_fee_from_outputs    (json array, optional, default=[]) The outputs to subtract the fee from.\n                              The fee will be equally deducted from the amount of each specified output.\n                              Those recipients will receive less bitcoins than you enter in their corresponding amount field.\n                              If no outputs are specified here, the sender pays the fee.\n```",
   "id": "c:6081762578",
   "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6081762578",
   "hash": "edd1d4b16ca52efc",
   "edited": null
  },
  {
   "t": "2026-10-09T16:14:39Z",
   "kind": "comment",
   "who": "psychemist",
   "assoc": "NONE",
   "text": "concept ACK",
   "id": "c:6084746784",
   "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6084746784",
   "hash": "d0815209cf45d36b",
   "edited": null
  },
  {
   "t": "2026-10-10T13:32:43Z",
   "kind": "review_comment",
   "who": "kevkevinpal",
   "assoc": "CONTRIBUTOR",
   "path": "src/rpc/client.cpp",
   "commit": "faeb073ca68348bc663c80b3f2b70d7014466b07",
   "in_reply_to": null,
   "text": "is there any reason why we don't have a snake_case for `includeWatching`?",
   "id": "rc:4237783105",
   "url": "https://github.com/bitcoin/bitcoin/pull/36489#discussion_r4237783105",
   "hash": "b6a220eb3f26b6b4",
   "edited": null
  },
  {
   "t": "2026-10-10T13:32:50Z",
   "kind": "review_comment",
   "who": "kevkevinpal",
   "assoc": "CONTRIBUTOR",
   "path": "src/rpc/client.cpp",
   "commit": "faeb073ca68348bc663c80b3f2b70d7014466b07",
   "in_reply_to": null,
   "text": "is there any reason why we don't have a snake_case for `includeWatching`?",
   "id": "rc:4237783381",
   "url": "https://github.com/bitcoin/bitcoin/pull/36489#discussion_r4237783381",
   "hash": "b6a220eb3f26b6b4",
   "edited": null
  },
  {
   "t": "2026-10-10T13:53:30Z",
   "kind": "review_comment",
   "who": "kevkevinpal",
   "assoc": "CONTRIBUTOR",
   "path": "src/rpc/client.cpp",
   "commit": "faeb073ca68348bc663c80b3f2b70d7014466b07",
   "in_reply_to": 4237783381,
   "text": "Never mind I see `includeWatching` is marked deprecated",
   "id": "rc:4237835992",
   "url": "https://github.com/bitcoin/bitcoin/pull/36489#discussion_r4237835992",
   "hash": "fae1a8fe2fae3037",
   "edited": null
  },
  {
   "t": "2026-10-10T13:53:53Z",
   "kind": "review_comment",
   "who": "kevkevinpal",
   "assoc": "CONTRIBUTOR",
   "path": "src/rpc/client.cpp",
   "commit": "faeb073ca68348bc663c80b3f2b70d7014466b07",
   "in_reply_to": 4237783105,
   "text": "Never mind I see `includeWatching` is marked deprecated",
   "id": "rc:4237837017",
   "url": "https://github.com/bitcoin/bitcoin/pull/36489#discussion_r4237837017",
   "hash": "fae1a8fe2fae3037",
   "edited": "2026-10-10T13:53:54Z"
  },
  {
   "t": "2026-10-10T14:01:18Z",
   "kind": "review_comment",
   "who": "kevkevinpal",
   "assoc": "CONTRIBUTOR",
   "path": "doc/release-notes-36489.md",
   "commit": "faeb073ca68348bc663c80b3f2b70d7014466b07",
   "in_reply_to": null,
   "text": "Should we add in the release note that sending both camelCase and snake_case will now throw an error?\n\nFor example `change_address` and `changeAddress`",
   "id": "rc:4237859410",
   "url": "https://github.com/bitcoin/bitcoin/pull/36489#discussion_r4237859410",
   "hash": "b953fc9fb01b7eff",
   "edited": null
  },
  {
   "t": "2026-10-10T14:01:34Z",
   "kind": "comment",
   "who": "kevkevinpal",
   "assoc": "CONTRIBUTOR",
   "text": "Concept ACK",
   "id": "c:6098272996",
   "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6098272996",
   "hash": "e8334cc43879b73c",
   "edited": null
  },
  {
   "t": "2026-10-12T06:36:00Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "doc/release-notes-36489.md",
   "commit": "faeb073ca68348bc663c80b3f2b70d7014466b07",
   "in_reply_to": 4237859410,
   "text": "I think that should be the obvious and expected behavior. No need to bloat the release notes with stuff that no user should be relying on.",
   "id": "rc:4245248551",
   "url": "https://github.com/bitcoin/bitcoin/pull/36489#discussion_r4245248551",
   "hash": "4d208698a0c86df6",
   "edited": "2026-10-12T06:36:01Z"
  },
  {
   "t": "2026-10-12T09:20:13Z",
   "kind": "comment",
   "who": "Conradgabe",
   "assoc": "NONE",
   "text": "tACK faeb073ca68348bc663c80b3f2b70d7014466b07\n\ni reproduced all 3 issues on master (05bc2f53ce), then verified the updates on regtest.\n\non master subtract_fee_from_outputs is ignored, with PR the fee is subtracted from the output. PR errors \"Do not set both\" for CamelCase and snake case fields and bitcoin-cli -named walletcreatefundedpsbt ... change_position=0 lock_unspents=true works with the PR.",
   "id": "c:6121356827",
   "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6121356827",
   "hash": "f017347fa51ebaaf",
   "edited": null
  },
  {
   "t": "2026-10-25T06:47:09Z",
   "kind": "comment",
   "who": "fametrano",
   "assoc": "NONE",
   "text": "The schema now rejects `changeAddress`, `changePosition`, `lockUnspents` and `subtractFeeFromOutputs`, which the server still accepts.\n\nIn `getopenrpcinfo` at faeb073ca68348bc663c80b3f2b70d7014466b07, the `options` object of `fundrawtransaction` and `walletcreatefundedpsbt` lists only the snake_case names, with `additionalProperties: false`. Nested properties carry no `x-bitcoin-aliases`. So the mismatch the description calls an issue is turned around, not removed: a client that validates against the schema refuses a camelCase request the server funds, and v32.0 shipped the camelCase names in this schema. Either the nested schema lists the aliases, or the camelCase names get a real deprecation, as #36488 does for `confTarget`. Today only the new error string calls them deprecated; the help and the release note do not.\n\nTwo camelCase names remain in text a user reads. The `change_type` help still says \"Only valid if changeAddress is not specified\", and an out-of-range position still fails with \"changePosition out of bounds\".\n\nThe rest matched. Without the change, `subtract_fee_from_outputs` was ignored and one spelling silently won when both were set. With it, all four options work in either spelling, in the options object, as named arguments and through `bitcoin-cli -named`, and setting both is rejected. I measured this on regtest against builds with and without this change, with calls sent through a client library I maintain. I can share the script and its output.",
   "id": "c:6394537752",
   "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6394537752",
   "hash": "d8b654f3278b1368",
   "edited": null
  },
  {
   "t": "2026-10-26T09:13:12Z",
   "kind": "comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nYes, I presume the schema rejecting the deprecated alias is intentional. This is the behavior before and after this pull request. (E.g. `verbosity|verbose` args behave the same before and after this pull). If the schema behavior should be changed, it should be done in a separate pull request, with a rationale and background for the change.",
   "id": "c:6412371025",
   "url": "https://github.com/bitcoin/bitcoin/pull/36489#issuecomment-6412371025",
   "hash": "f88e981e716a175e",
   "edited": null
  }
 ],
 "labels_log": [
  {
   "t": "2026-10-09T11:36:00Z",
   "action": "labeled",
   "label": "Wallet",
   "who": "DrahtBot"
  },
  {
   "t": "2026-10-09T12:31:40Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-10-09T14:20:10Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  }
 ],
 "state_log": [],
 "text_chars": 16241,
 "text_tokens_estimate": 4060,
 "changed_paths": [
  "doc/release-notes-36489.md",
  "src/rpc/client.cpp",
  "src/wallet/rpc/spend.cpp",
  "test/functional/wallet_basic.py",
  "test/functional/wallet_fundrawtransaction.py",
  "test/functional/wallet_keypool.py",
  "test/functional/wallet_musig.py"
 ],
 "files": [
  {
   "path": "doc/release-notes-36489.md",
   "add": 7,
   "del": 0
  },
  {
   "path": "src/rpc/client.cpp",
   "add": 6,
   "del": 0
  },
  {
   "path": "src/wallet/rpc/spend.cpp",
   "add": 30,
   "del": 14
  },
  {
   "path": "test/functional/wallet_basic.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/wallet_fundrawtransaction.py",
   "add": 6,
   "del": 0
  },
  {
   "path": "test/functional/wallet_keypool.py",
   "add": 3,
   "del": 2
  },
  {
   "path": "test/functional/wallet_musig.py",
   "add": 1,
   "del": 1
  }
 ],
 "test_lines": 15,
 "git": {
  "head": "faeb073ca68348bc663c80b3f2b70d7014466b07",
  "head_matches_backup": true,
  "base": "4bacf21a13c2ed25ef9362ca38f26bf0a67d22c9",
  "patch_id": "9e010b5208d5589c",
  "commits": [
   {
    "sha": "fac8ef10f4",
    "subject": "wallet: rpc: Add snake_case aliases for wallet funding options",
    "files": 4,
    "add": 49,
    "del": 14
   },
   {
    "sha": "faeb073ca6",
    "subject": "test: Use new named arg aliases in tests",
    "files": 3,
    "add": 5,
    "del": 4
   }
  ],
  "patch_truncated": false
 },
 "patch_id": "9e010b5208d5589c",
 "input_hash": "dbae80559cfca342",
 "extracted_at": "2026-11-02T01:09:49+00:00"
}