{
 "number": 32468,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/32468",
 "title": "rpc: generateblock to allow multiple outputs",
 "author": "polespinasa",
 "author_association": "MEMBER",
 "created_at": "2025-05-10T17:34:29Z",
 "updated_at": "2026-09-17T11:34:30Z",
 "age_days": 494,
 "draft": false,
 "labels": [
  "RPC/REST/ZMQ"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "1f1c5fd6fa177c71405fa748e8e5c5ee53b73332",
 "head_ref": "generatetomany",
 "head_repo": "polespinasa/bitcoin",
 "head_history": [
  {
   "t": "2025-05-10T17:38:54Z",
   "sha": "a68952545796371ffe41d5dc6c70e3dbd46af076"
  },
  {
   "t": "2025-05-10T17:48:29Z",
   "sha": "b98da788b0904f98e5ff2af5065e5557ea443bfd"
  },
  {
   "t": "2025-05-10T18:01:37Z",
   "sha": "fb28aea67d0278cba8dba62d48ae9a756608a1cb"
  },
  {
   "t": "2025-05-12T07:03:45Z",
   "sha": "5dd2bba6f908da80b5a90261f32dc541c07a0d93"
  },
  {
   "t": "2025-05-12T08:37:44Z",
   "sha": "db5f8fe3af2fa4dbf55acb4e45315657645fa899"
  },
  {
   "t": "2025-05-12T08:55:10Z",
   "sha": "914327458fbc9d89ca48952b9871c31f0e0b4033"
  },
  {
   "t": "2025-05-12T09:16:20Z",
   "sha": "5a5ff2a20cdff56b5756fa0b6c9cbb9184f17818"
  },
  {
   "t": "2025-05-20T09:09:00Z",
   "sha": "db8b5893a04da996294772ddb5a096b78e3fc8db"
  },
  {
   "t": "2025-05-20T09:44:13Z",
   "sha": "cd8c13ce116249472d03b1f2f179b8a382d8ba41"
  },
  {
   "t": "2025-05-20T09:57:52Z",
   "sha": "8b5dd8a5f135ce1aaf80d8c28943f503f4ee19d4"
  },
  {
   "t": "2025-05-25T10:13:27Z",
   "sha": "67172f6b1bef1741b10348e552c905b72878a524"
  },
  {
   "t": "2025-05-26T11:29:26Z",
   "sha": "0c4407143c5b16c1cb37e375397c517075c99bbb"
  },
  {
   "t": "2025-05-26T13:11:14Z",
   "sha": "4c0337aea5fe7bf84fe96660aa7756e5b0146b23"
  },
  {
   "t": "2025-05-26T13:12:21Z",
   "sha": "c7caddbbf7461fec6262f6378a4b5e8b31fbea29"
  },
  {
   "t": "2025-05-26T13:28:13Z",
   "sha": "a4c0eecc8fe38623958bf3422d58d170e66b0f3c"
  },
  {
   "t": "2025-05-30T11:58:22Z",
   "sha": "bd2c8b255ad1cc32505feec5b22e734f8592d4b3"
  },
  {
   "t": "2025-05-30T12:05:49Z",
   "sha": "4ff4e0194ba6c850d53bba4e281fca5e69386228"
  },
  {
   "t": "2025-05-30T13:11:53Z",
   "sha": "2c855694c795a31f13a473d6a6eb80c5d765e8ed"
  },
  {
   "t": "2025-06-09T16:44:05Z",
   "sha": "00a5104ea984d75ae769a4af49d480272e8562f6"
  },
  {
   "t": "2025-06-09T20:53:57Z",
   "sha": "551f97cf6a84fa56de36b67650853fb0cd9752d7"
  },
  {
   "t": "2025-06-11T23:03:42Z",
   "sha": "f426866d00e9c85c435c21fee1cf84ca135d9005"
  },
  {
   "t": "2025-06-12T06:37:14Z",
   "sha": "d89b9008a9085f95dc84cd64b6010f3c0592bb3f"
  },
  {
   "t": "2025-06-12T07:53:23Z",
   "sha": "7e8893cdb88ab6ff282847c405ab069241e0e0d6"
  },
  {
   "t": "2025-06-12T07:58:43Z",
   "sha": "cdd082612f951f320c75828b2b3eda65b009afa1"
  },
  {
   "t": "2025-06-26T07:55:45Z",
   "sha": "f7a09296544aece8baa8732115547e0e458af9c6"
  },
  {
   "t": "2025-08-18T20:58:43Z",
   "sha": "52243063c1df4d1adf7b54e90e24026898914dad"
  },
  {
   "t": "2025-08-18T21:51:12Z",
   "sha": "f5b31fa519dd63919be9c7897a446cd8b522243c"
  },
  {
   "t": "2025-08-18T22:13:38Z",
   "sha": "19581ecf17234fdc4088d0473c7014f6f0b39418"
  },
  {
   "t": "2025-08-18T22:27:12Z",
   "sha": "7f7abe315ae71e3f26f3135a900cd09c105e471a"
  },
  {
   "t": "2025-08-18T22:34:09Z",
   "sha": "ea5c4f79f33f2070fca14719030c46dcc1d10886"
  },
  {
   "t": "2025-08-18T23:14:56Z",
   "sha": "912d9cbfd1f60d3b8045c3d52cc28bfea8a033af"
  },
  {
   "t": "2025-08-18T23:54:23Z",
   "sha": "847fd390884f6e7c2ecea9b48334a9687cfd7c06"
  },
  {
   "t": "2025-08-20T17:16:51Z",
   "sha": "52257ede2de73efe43910985dd651428612a3e11"
  },
  {
   "t": "2025-08-20T17:33:42Z",
   "sha": "adc76f791c7e7268edcd32e35a3caf90461e1287"
  },
  {
   "t": "2025-08-20T20:59:03Z",
   "sha": "ae33a5625a391a4dca7384930ed2539f89e88be7"
  },
  {
   "t": "2025-08-20T22:08:20Z",
   "sha": "0d55bc486e41855f4125fa9f55c3d31483403cb5"
  },
  {
   "t": "2025-09-26T00:05:46Z",
   "sha": "1bf2edb113c656595d352d7559d6d9546898aba3"
  },
  {
   "t": "2025-09-26T19:25:19Z",
   "sha": "ee72e34bda3d5797e2753f359361048ac3270463"
  },
  {
   "t": "2025-09-26T20:07:43Z",
   "sha": "30244fb3417f92d19142de46008232acb4ab4e7c"
  },
  {
   "t": "2026-02-24T19:11:57Z",
   "sha": "46bbf198e8127a47d8e34554954a478d47880075"
  },
  {
   "t": "2026-03-25T08:12:12Z",
   "sha": "629565c8fc03f22e069e1142c5a1731b073ec414"
  },
  {
   "t": "2026-03-25T08:24:21Z",
   "sha": "dd268b257d0f87fc042c330a0d23a6471ef4d3f6"
  },
  {
   "t": "2026-04-02T18:06:08Z",
   "sha": "9d7fd644a1e0c2827881a60bc11c521b2f6ae7d5"
  },
  {
   "t": "2026-05-18T17:32:02Z",
   "sha": "8fb7e2ba591329f6899b7625843a508bf4287b60"
  },
  {
   "t": "2026-05-18T20:36:34Z",
   "sha": "6e2dc3e533eac184570743a08e10dc1a298ac270"
  },
  {
   "t": "2026-05-18T21:37:04Z",
   "sha": "03dcd180433b20289ac49f19ed12900e2c632cbf"
  },
  {
   "t": "2026-05-19T21:00:36Z",
   "sha": "addc3cd9a453ad0fe343e1eaa93ac4a786f1dca5"
  },
  {
   "t": "2026-05-19T21:04:42Z",
   "sha": "0059a7b0d9a2e3eb074a1e880a4b56cea03d9351"
  },
  {
   "t": "2026-08-27T11:16:19Z",
   "sha": "d31d637a6dfbdb55ad6fb948b04599e1edecade2"
  },
  {
   "t": "2026-08-27T11:24:24Z",
   "sha": "261fd699de100b213ddfd088ddca1567809aba38"
  },
  {
   "t": "2026-09-16T15:06:34Z",
   "sha": "55bcd94ff3bb1b3679704eae157f13be78aa54c7"
  },
  {
   "t": "2026-09-16T18:32:18Z",
   "sha": "1f1c5fd6fa177c71405fa748e8e5c5ee53b73332"
  }
 ],
 "additions": 265,
 "deletions": 56,
 "changed_files": 15,
 "commit_count": 7,
 "size_bucket": "M",
 "mergeable_state": "clean",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {},
   "conflicts": [
    {
     "number": 36263,
     "title": "rpc: clarify tx decode error in remaining RPCs",
     "author": "MrHodlX"
    },
    {
     "number": 36047,
     "title": "rpc: handle createNewBlock() returning nullptr during shutdown",
     "author": "chriszeng1010"
    },
    {
     "number": 35793,
     "title": "Implement BIP 54 (Consensus Cleanup) without mainnet activation",
     "author": "darosior"
    },
    {
     "number": 35675,
     "title": "mining: add block template manager",
     "author": "ismaelsadeeq"
    },
    {
     "number": 35581,
     "title": "node: add block template manager and track waitNext fee inflow",
     "author": "ismaelsadeeq"
    },
    {
     "number": 33922,
     "title": "mining: add getMemoryLoad() and track template non-mempool memory footprint",
     "author": "Sjors"
    }
   ]
  }
 },
 "acks_parsed": {},
 "acks_tally": {
  "ack": 0,
  "stale_ack": 0,
  "concept_ack": 0,
  "approach_ack": 0,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 0,
  "changes_requested": 0,
  "distinct_reviewers": [
   "a1denvalu3",
   "achow101",
   "andrewtoth",
   "maflcko",
   "mzumsande",
   "naiyoma",
   "sedited",
   "stickies-v",
   "supertestnet"
  ]
 },
 "signals": {
  "needs_rebase": false,
  "ci_failed": false,
  "mergeable_state": "clean",
  "last_author_activity": "2026-09-16T18:35:09Z",
  "last_reviewer_activity": "2026-04-21T15:10:31Z",
  "last_reviewer": "stickies-v",
  "author_silent_days": 0,
  "waiting_on_author_days": 0,
  "days_since_update": 0
 },
 "refs": {
  "mentioned": [
   31684,
   33230
  ],
  "depends_on": [],
  "fixes": [],
  "linked_issues": [],
  "references": [
   {
    "number": 31684,
    "type": "issue",
    "state": "closed",
    "merged": false,
    "merged_at": null,
    "title": "`generateblock` RPC Not Collecting Transaction Fees"
   },
   {
    "number": 33230,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2025-09-25",
    "title": "cli: Handle arguments that can be either JSON or string"
   }
  ],
  "conflicts": [
   36263,
   36047,
   35793,
   35675,
   35581,
   33922
  ]
 },
 "stack": {
  "shares_commits_with": [],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [
  "src/node/miner.cpp",
  "src/rpc/client.cpp",
  "src/rpc/mining.cpp",
  "test/functional/feature_assumeutxo.py",
  "test/functional/rpc_generate.py",
  "test/functional/rpc_txoutproof.py"
 ],
 "body": "## Generatetomany\n\nFirst approach was to create a `generatetomany` rpc call. That approach can be seen here https://github.com/polespinasa/bitcoin/pull/3\n\n## Generateblock\nModifies `generateblock` to allow a user to set multiple outputs in the coinbase transaction. If an empty set is provided, the block will be empty. If no set of transactions is provided, the block will mine the mempool. If a set of transactions is provided only that set of txs will be mined.\n\n```\n$./bitcoin-cli -rpcport=18443 generateblock bcrt1qw6qkj8wtw5hraxwxjp08m4aymkntms3yhqyacj\n{\n  \"hash\": \"7359a3ed7af0f18f4016e6cb29193bd787a2452c584781135c585d5204b9ec5b\"\n}\n\n$ ./bitcoin-cli -rpcport=18443 generateblock '[\"bcrt1qal6p633hvwz2yp5mav0qy7u2az8gkn2xywnj6v\", \"bcrt1qvr3qgyhw6y0e0zj97v0j5yc40xtpea4wqj0g43\"]'\n{\n  \"hash\": \"6db028454b26d6667dd6df45be2772844121fb44f86433f6bbfbafa429974684\"\n}\n\n$ ./bitcoin-cli -rpcport=18443 generateblock '[\"bcrt1qal6p633hvwz2yp5mav0qy7u2az8gkn2xywnj6v\", \"bcrt1qvr3qgyhw6y0e0zj97v0j5yc40xtpea4wqj0g43\"]' []\n\n{\n  \"hash\": \"33e2ddc52546ddb0edf28bef5b295ee8fbd487b8aca19c97018467e2477877df\"\n}\n\n```\n\n### Motivation\nhttps://x.com/SuperTestnet/status/1921220086645342550\n\nCitating @supertestnet\n[quoted text omitted]",
 "commits": [
  {
   "sha": "73b2e695b147fa5630a947f1e75390f1d17da553",
   "date": "2026-09-16T16:43:07Z",
   "message": "rpc: Expand generateblock transactions argument options\n\nAllow generateblock to mine empty blocks, blocks with a pre-set of transactions or\nmine transactions from the mempool."
  },
  {
   "sha": "17250692027bb310c2dc6085d1ce9fbc84640a90",
   "date": "2026-09-16T16:51:29Z",
   "message": "test: expand generateblock test coverage"
  },
  {
   "sha": "fdf493625e197fb77b638c0cc544e12d2ddac7aa",
   "date": "2026-09-16T17:45:58Z",
   "message": "rpc: add multiple outputs to generateblock\n\nAllow to add multiple outputs to the coinbase transaction when using generateblock.\nThe block reward, previously burned is now splited in equal parts among the different outputs.\nIf the reward is odd, the first N outputs get an extra sat. Being N = total_reward % num_outputs."
  },
  {
   "sha": "ef1179489119d9e5eac390ffffb663787a78080b",
   "date": "2026-09-16T17:51:12Z",
   "message": "test: add custom outputs test coverage for generateblock\n\nAlso remove now unecesary raw outputs from other tests consuming\nthe generateblock rpc."
  },
  {
   "sha": "e71d9dd9234937a62ffef53a337f0e6b416ea30c",
   "date": "2026-09-16T17:59:15Z",
   "message": "rpc: add custom split reward to generateblock\n\nAllows to specify custom rewards for each output of the coinbase transaction.\nPreviously the reward was split into equal parts.\n\nCo-authored-by: Biel <bicaru2@gmail.com>"
  },
  {
   "sha": "da81307509991e70d45a1652a20cd719662938ca",
   "date": "2026-09-16T18:17:13Z",
   "message": "test: add test coverage for custom reward of generateblock"
  },
  {
   "sha": "1f1c5fd6fa177c71405fa748e8e5c5ee53b73332",
   "date": "2026-09-16T18:17:26Z",
   "message": "Add release notes\n\nCo-authored-by: Biel <bicaru2@gmail.com>"
  }
 ],
 "timeline": [
  {
   "t": "2025-05-10T17:38:54Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "a68952545796371ffe41d5dc6c70e3dbd46af076"
  },
  {
   "t": "2025-05-10T17:42:28Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "I would like to discuss how to implement reward distribution. Do we ask the user for the exact number of bitcoins for each address or do we opt to use percentages of the reward?\n\nIMHO it is better to use percentages, it makes things easier for the user."
  },
  {
   "t": "2025-05-10T17:48:29Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "b98da788b0904f98e5ff2af5065e5557ea443bfd"
  },
  {
   "t": "2025-05-10T17:56:20Z",
   "kind": "comment",
   "who": "andrewtoth",
   "assoc": "MEMBER",
   "text": "The `generateblock` command takes either an address or descriptor as its first argument. Perhaps it would be easier to extend that RPC to also take an array of address or descriptor and value pairs? That way we won't need a new RPC."
  },
  {
   "t": "2025-05-10T17:59:24Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nThat would be easy as the code is already done on the new RPC. But this change would not be backwards compatible, idk if we want to keep it that way.\n\nThere are some softwares like [Polar](https://lightningpolar.com/) that would be affected by this."
  },
  {
   "t": "2025-05-10T18:01:37Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "fb28aea67d0278cba8dba62d48ae9a756608a1cb"
  },
  {
   "t": "2025-05-10T18:17:36Z",
   "kind": "comment",
   "who": "andrewtoth",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nSure it would be. Just parse an array first and if that fails parse a string."
  },
  {
   "t": "2025-05-10T21:48:29Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nOh right, that's an option. I will let it as it is for now to see other contributors' opinions.\n\nMay take your approach later."
  },
  {
   "t": "2025-05-10T23:38:51Z",
   "kind": "comment",
   "who": "supertestnet",
   "assoc": "NONE",
   "text": "Can a PSBT be constructed with only outputs, no inputs? If so, then maybe `generateblock` could accept a psbt or a string as an argument. If it is a psbt, it must contain outputs but no inputs.\n\nBut also, due to fees being variable, it may be useful to have some kind of \"remainder\" option so that you can say, for example, \"give 1 btc apiece to the first 3 addresses, and give the remainder to the last address\""
  },
  {
   "t": "2025-05-11T07:51:51Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nI'm not sure using a PSBT is the best approach. If we check the [normal workflow](https://github.com/bitcoin/bitcoin/blob/master/doc/psbt.md#overall-workflow) for a PSBT we see it is intended to:\n1. Create the PSBT with inputs and outputs but no metadata\n2. Updated with the data needed to spend the UTXOs in the inputs\n3. Signed\n4. Finalized\n\nIMO using PSBTs here does not make sense, we don't need any of that, we don't need to share with other users or software to sign or add information to inputs. It's easier to just provide a JSON with the addresses and amounts (it's the only info we need), also using a JSON it's easier to implement with less changes.\n\n[quoted text omitted]\nDo you have any idea on how that could look like?\nMaybe something like this; where `amount_fixed` takes a number and `share_reminder` is a boolean:\n`generatetomany 1 [{addr1, amount_fixed, share_remainder}, ...]`\n\nAs per your example would be:\n```\ngeneratetomany 1 [{bcrt1qal6p633hvwz2yp5mav0qy7u2az8gkn2xywnj6v, 1, 0}, {bcrt1q3me8uxjzw2egq76hjw6zcgzmlhlzzztfwqzjfv, 1, 0}, {bcrt1q57yu04dn4l0zxv6ul4prm7favr630d3lmwvjh0, 1, 0}, {bcrt1qal6p633hvwz2yp5mav0qy7u2az8gkn2xywnj6v, 0, 1}]\n```"
  },
  {
   "t": "2025-05-11T07:57:07Z",
   "kind": "comment",
   "who": "supertestnet",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nHere is how the syntax looks for the `sendmany` command which I am using as inspiration:\n\n`bitcoin-cli sendmany \"\" \"{\\\"bc1q09vm5lfy0j5reeulh4x5752q25uqqvz34hufdl\\\":0.01,\\\"bc1q02ad21edsxd23d32dfgqqsz4vv4nmtfzuklhy3\\\":0.02}\"`\n\nSo maybe we could do something similar:\n\n`bitcoin-cli generatetomany \"{\\\"bcrt1qal6p633hvwz2yp5mav0qy7u2az8gkn2xywnj6v\\\":1,\\\"bcrt1q3me8uxjzw2egq76hjw6zcgzmlhlzzztfwqzjfv\\\":1,\\\"bcrt1q57yu04dn4l0zxv6ul4prm7favr630d3lmwvjh0\\\":1,\\\"bcrt1qal6p633hvwz2yp5mav0qy7u2az8gkn2xywnj6v\\\":\\\"remainder\\\"}\" ` <-- note the remainder in the last btc address"
  },
  {
   "t": "2025-05-11T08:08:02Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nwhat if you want to split the reminder between multiple addresses?"
  },
  {
   "t": "2025-05-11T11:09:20Z",
   "kind": "comment",
   "who": "a1denvalu3",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\n`\nbitcoin-cli generatetomany 5  \"{\\\"bcrt1qal6p633hvwz2yp5mav0qy7u2az8gkn2xywnj6v\\\":1,\\\"bcrt1q3me8uxjzw2egq76hjw6zcgzmlhlzzztfwqzjfv\\\":1,\\\"bcrt1q57yu04dn4l0zxv6ul4prm7favr630d3lmwvjh0\\\":1,\\\"bcrt1qal6p633hvwz2yp5mav0qy7u2az8gkn2xywnj6v\\\":\\\"remainder\\\",\n\\\"bcrt1qz07rr2j8r699c9r55rt44q9vm3faxgprlv62xx\\\":\\\"remainder\\\",\n\\\"bcrt1q9vur8vqhfndr8r76eveuu2wr46f2rs8fgv2kvh\\\":\\\"remainder\\\"}\"\n`\n\nAll fields with \"remainder\" to have the remainder split equally amongst them?"
  },
  {
   "t": "2025-05-11T12:36:38Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/node/miner.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": null,
   "text": "this is now dead code, according to https://corecheck.dev/bitcoin/bitcoin/pulls/32468\n\nGenerally, I am not sure about modifying real code to accommodate test-only code. It would be better to not modify `src/node` at all and just put the test-only code in the test-only code paths.\n\n(Unless the code may be useful outside of tests, but then you'll have to explain how)"
  },
  {
   "t": "2025-05-11T15:34:40Z",
   "kind": "comment",
   "who": "a1denvalu3",
   "assoc": "NONE",
   "text": "@polespinasa @supertestnet  Please check out https://github.com/polespinasa/bitcoin/pull/1 with the discussed changes and let me know what you think.\n\nAlso maybe we would want to follow @andrewtoth  advice and not create a new rpc command in the first place."
  },
  {
   "t": "2025-05-11T17:27:34Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/node/miner.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2083512984,
   "text": "[quoted text omitted]\n\nWill delete it, was just added as all the else statement code is not needed for the simeple `generatetoaddress`.\n\n[quoted text omitted]\nI'm not understanding this part, what do you mean by test-only code? I don't see a way to add this functionality without modifying this src/node/... files. Care to explain more?"
  },
  {
   "t": "2025-05-11T17:30:12Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nI don't see duplicating entries as a good option. Could lead to errors. I think is better to have two camps for each address entry, one for the amount (can be 0) and one for reminder (can be done with 0 or 1 or by setting \"remainder\" or an empty string)"
  },
  {
   "t": "2025-05-11T17:31:56Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nleft some comments on your proposal PR\n\n[quoted text omitted]\nStill not sure about this, would like to know more opinions, for other things like `send` we have multiple RPCs. Anyway, it's an easy change, so it's something we can do at the end if we want."
  },
  {
   "t": "2025-05-11T17:51:23Z",
   "kind": "comment",
   "who": "a1denvalu3",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\nHow is it duplicating entries? In the example there is a different address for each entry."
  },
  {
   "t": "2025-05-11T17:54:04Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nFirst address is duplicated. Anyway it is duplicated in case you want to assign an amount to an address + remainder."
  },
  {
   "t": "2025-05-12T05:21:09Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/node/miner.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2083512984,
   "text": "test-only code is code that is only called by tests (unit, or functional tests, or on regtest, testnet, signet, ...), but never on mainnet.\n\n`static UniValue generateBlocks` is a test-only function, so a similar approach could be used here."
  },
  {
   "t": "2025-05-12T07:01:29Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/node/miner.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2083512984,
   "text": "So you suggest duplicating `CreateNewBlock` with a test-only version?\nI don't see how to implement the changes outside that function..."
  },
  {
   "t": "2025-05-12T07:03:45Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "5dd2bba6f908da80b5a90261f32dc541c07a0d93"
  },
  {
   "t": "2025-05-12T07:06:22Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/node/miner.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2083512984,
   "text": "It is possible to call CNB from the test-only function. Something like:\n\n```cpp\ndef CNB_test()\n b = CNB()\n b.vtx[0].output_script = b'aa'\n ... etc"
  },
  {
   "t": "2025-05-12T08:37:44Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "db5f8fe3af2fa4dbf55acb4e45315657645fa899"
  },
  {
   "t": "2025-05-12T08:55:10Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "914327458fbc9d89ca48952b9871c31f0e0b4033"
  },
  {
   "t": "2025-05-12T09:16:20Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "5a5ff2a20cdff56b5756fa0b6c9cbb9184f17818"
  },
  {
   "t": "2025-05-12T09:26:15Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": null,
   "text": "This is necessary to avoid `RegenerateCommitments` to return -1 so breaking the code.\nIdk if there's a better approach to it."
  },
  {
   "t": "2025-05-12T09:27:43Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/node/miner.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2083512984,
   "text": "Thanks for the review! Please see 5a5ff2a20cdff56b5756fa0b6c9cbb9184f17818\nTried to follow your approach, actually it makes things easier :)\n\nWill squash commits after ack the new approach better than the first one."
  },
  {
   "t": "2025-05-12T14:45:14Z",
   "kind": "review",
   "who": "mzumsande",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "5a5ff2a20cdff56b5756fa0b6c9cbb9184f17818",
   "text": "Could the motivation be added here? Doesn't seem ok having to resort to twitter (where people without an account can't even see most of the thread) to know the reason for a PR."
  },
  {
   "t": "2025-05-12T16:24:13Z",
   "kind": "comment",
   "who": "supertestnet",
   "assoc": "NONE",
   "text": "Here is my motivation:\n\nWhen mining a block on regtest, the command \"generatetoaddress\" is available if you want to send the entire coinbase to 1 address. Let's add generatetomany in case you want to split up the coinbase among multiple addresses, similar to how the \"sendtoaddress\" and \"sendmany\" commands both exist and let you send money to (1) one address or (2) multiple addresses. The generatetomany command would be particularly useful for simulating protocols that send money to multiple recipients directly from a coinbase, as several pools do now, like ocean and braidpool."
  },
  {
   "t": "2025-05-12T16:39:42Z",
   "kind": "comment",
   "who": "andrewtoth",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nSince I don't seem to have convinced you, here are some more arguments for why this feature belongs in `generateblock` instead of a new RPC:\n\n- New RPCs require adding more code to test, and once added must go through a deprecation cycle to be removed (if they can be removed at all without disrupting too many users).\n- Consumers of the RPCs must write additional code for the new RPC, instead of simply modifying the argument type.\n- `generateblock` is much more flexible than `generatetoaddress` (or `generatetodescriptor`), since it takes the txs to include as the second argument. For advanced test cases, it is likely that users would want this functionality to test multiple output coinbases with blocks that mine non-standard txs or otherwise don't mine the entire mempool. They would not have this capability with `generatetomany` as implemented here, but would have that for free with `generateblock`.\n- `generateblock` currently doesn't collect transaction fees (https://github.com/bitcoin/bitcoin/issues/31684), so adding this functionality to it would fix this issue. Users could just call `generateblock` with an array containing a single `address/descriptor:value` pair that has the reward plus fees.\n- `generateblock` is capable of mining invalid blocks, since the txs to mine in the second argument can be any set of txs. We can similarly punt the calculation of the coinbase reward to the caller, so they must correctly calculate that all the values of the outputs add up to no more than the correct reward + fees. This removes the bikeshedding of whether to use `remainder` or split values up evenly."
  },
  {
   "t": "2025-05-12T18:55:04Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nThis is a fair point, the only bad thing is that (if I'm not wrong) `generateblock` is thought to be used always with a given set of txs and that may not always be the use case. Maybe would be worth to implement it on both RPC?\n\nFor the first two points I understand them, but I don't think it's a problem. In case we consider those two reasons enough to not add a new PRC, this could be adapted to work inside `generatetoaddress` or `generatetodescriptor` adding the new arguments (payout amounts) and making them optional to keep the original behaviour if wanted. Making it backward compatible.\n\n[quoted text omitted]\nThis is also a good point but also focused on only this use case. Would say the same as before, you may want to mine txs from the mempool and not care about the exact amount of sats to distribute. Maybe implement this on both RPC is the solution to it.\n\nWhat do you think?"
  },
  {
   "t": "2025-05-12T19:34:55Z",
   "kind": "comment",
   "who": "andrewtoth",
   "assoc": "MEMBER",
   "text": "Consider if we already had the functionality for this in `generateblock` - what would be the motivation to add a new RPC `generatetomany`?\nNote that `sendtoaddress` and `sendmany` have both been superseded by `send`, but the older RPCs can't easily be removed. `sendall` is an interesting case, which we might want to mimic instead of adding a `remainder` field. But, then that won't fix #31684."
  },
  {
   "t": "2025-05-13T17:22:13Z",
   "kind": "comment",
   "who": "andrewtoth",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\n[quoted text omitted]\nI think you are making the case to add a feature to `generateblock` to mine the mempool and collect rewards the same as `generateto` commands. Perhaps we can make the second argument of `generateblock` optional, and if there is no set of txs provided then mine the mempool.\n\nI don't think we should be duplicating the effort implementing this on more than one RPC. Then every new mining test feature needs to be duplicated (or triplicated for `generatetodescriptor`/`generatetomany`). We should deprecate `generateto` RPCs and just use `generateblock` for everything going forward, similar to `send` vs `sendtoaddress`/`sendmany`."
  },
  {
   "t": "2025-05-14T07:27:41Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nThat could be a smart approach. But I would always take the mempool or also put an optional argument to mine the mempool so it is not one or the other.\n\n[quoted text omitted]\nI might agree, will think how to build it around `generateblock`. Deprecation for the other RPCs can be done in another PR as I think will be a blocking reason for merging, don't want it to influence this one."
  },
  {
   "t": "2025-05-20T09:09:00Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "db8b5893a04da996294772ddb5a096b78e3fc8db"
  },
  {
   "t": "2025-05-20T09:44:13Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "cd8c13ce116249472d03b1f2f179b8a382d8ba41"
  },
  {
   "t": "2025-05-20T09:57:52Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "8b5dd8a5f135ce1aaf80d8c28943f503f4ee19d4"
  },
  {
   "t": "2025-05-20T09:58:36Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nThis is implemented here 8b5dd8a5f135ce1aaf80d8c28943f503f4ee19d4\nWith a small difference, if no set of txs is provided then we mine the mempool, if an empty set is provided we mine an empty block (original behaviour of the RPC).\n\nNote: for the moment fee collector is not implemented if a set of tx is set manually"
  },
  {
   "t": "2025-05-20T11:31:57Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": null,
   "text": "not sure about forcing an array, when all tests mostly just want to provide a single dummy value.\n\nit would be good to make this optional and then, require one of `output` or `outputs` to be present, or maybe even fallback to `OP_TRUE` if none are given? edit: Or maybe just fallback to OP_RETURN to avoid interfering with tests that assume utxo state?"
  },
  {
   "t": "2025-05-20T14:46:15Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2097722076,
   "text": "[quoted text omitted]\n\nI don't think this should be a problem.\nSame happens with `sendall`. Most tests just provide a single value in a list. And it actually doesn't affect many tests.\n\nI think it keeps the code simpler and avoids the confusion that could appear if we use multiple possible arguments.\n\nAlso, even if this is not a backward compatible change it's not something critical as it is the test code.\n\nBut I like the idea of making it optional with a fallback to OP_RETURN if there are no values provided."
  },
  {
   "t": "2025-05-24T10:36:56Z",
   "kind": "review",
   "who": "naiyoma",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "8b5dd8a5f135ce1aaf80d8c28943f503f4ee19d4",
   "text": "I'm a bit confused about the current approach. Are you planning to add `generatetomany` and also extend `generateblock` to accommodate an array of addresses?\n\nI suggest that you put one approach in your fork and indicate this clearly in your description\u2014separation of concerns makes it easier to follow and review.\n\nFor example:\nApproach 1\nApproach 2 \u2192 Link to the PR in your fork"
  },
  {
   "t": "2025-05-24T10:40:26Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\n`generatetomany` will not be added. I have to delete that code."
  },
  {
   "t": "2025-05-24T10:42:36Z",
   "kind": "comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nGenerally, it is best to just push the final version of the code, so that it is ready for further review. Prior versions of the code can trivially be retrieved via the commit hash (or a named alias), if needed."
  },
  {
   "t": "2025-05-24T10:43:11Z",
   "kind": "review_comment",
   "who": "naiyoma",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": null,
   "text": "11 shouldn't be str\n ```diff\n--- a/src/rpc/mining.cpp\n+++ b/src/rpc/mining.cpp\n@@ -351,7 +351,7 @@ static RPCHelpMan generatetomany()\n              }},\n         RPCExamples{\n             \"\\nGenerate 11 blocks to two different addresses:\\n\"\n-            + HelpExampleCli(\"generatetomany\", \"\\\"11 '[\\\\\\\"bcrt1qal6p633hvwz2yp5mav0qy7u2az8gkn2xywnj6v\\\\\\\", \\\\\\\"bcrt1qvr3qgyhw6y0e0zj97v0j5yc40xtpea4wqj0g43\\\\\\\"]'\\\"\")\n+            + HelpExampleCli(\"generatetomany\", \"11 '[\\\"bcrt1qal6p633hvwz2yp5mav0qy7u2az8gkn2xywnj6v\\\", \\\"bcrt1qvr3qgyhw6y0e0zj97v0j5yc40xtpea4wqj0g43\\\"]'\")\n\n```"
  },
  {
   "t": "2025-05-25T10:13:27Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "67172f6b1bef1741b10348e552c905b72878a524"
  },
  {
   "t": "2025-05-25T10:15:57Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "Squashed all commits and removed the first approach (`generatetomany`) which can still be checked here https://github.com/polespinasa/bitcoin/pull/3"
  },
  {
   "t": "2025-05-25T10:16:36Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2105783773,
   "text": "Thx!\nWill correct in case we revert to `generatetomany` approach."
  },
  {
   "t": "2025-05-25T15:25:08Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_txoutproof.py",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": null,
   "text": "all those `raw(` can probably just be omitted and use the OP_RETURN fallback"
  },
  {
   "t": "2025-05-26T11:29:26Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "0c4407143c5b16c1cb37e375397c517075c99bbb"
  },
  {
   "t": "2025-05-26T11:31:21Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_txoutproof.py",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2106232962,
   "text": "done!"
  },
  {
   "t": "2025-05-26T11:32:01Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "- OP_RETURN fallback if no address or descriptor set is provided.\n- A few tests added to test new functionalities"
  },
  {
   "t": "2025-05-26T11:33:29Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2097722076,
   "text": "I've set \"output\" as optional but still I have to provide at least an empty list. I'm unable to see how to make it fully optional.\n```\n$ ./bitcoin-cli -rpcport=18443 generateblock\nerror code: -3\nerror message:\nJSON value of type null is not of expected type array\n```\n\n```\n$ ./bitcoin-cli -rpcport=18443 generateblock []\n{\n  \"hash\": \"25987bbfbce2be6c61393ed95340729ff2cc25c2b26db422b6e43c8a8f4558a0\"\n}\n```"
  },
  {
   "t": "2025-05-26T12:08:44Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2097722076,
   "text": "`get_array` is a check function to ensure the type is array. (The type null is not the type array, so the check fails)\n\nThe fix would be to not call `get_array` when the type is null."
  },
  {
   "t": "2025-05-26T13:11:14Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "4c0337aea5fe7bf84fe96660aa7756e5b0146b23"
  },
  {
   "t": "2025-05-26T13:12:21Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "c7caddbbf7461fec6262f6378a4b5e8b31fbea29"
  },
  {
   "t": "2025-05-26T13:16:12Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2097722076,
   "text": "oh you're right, solved :)"
  },
  {
   "t": "2025-05-26T13:28:13Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "a4c0eecc8fe38623958bf3422d58d170e66b0f3c"
  },
  {
   "t": "2025-05-27T12:53:19Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": null,
   "text": "\u201cinto a OP_RETURN output.\u201d\n-> \u201cinto an OP_RETURN output.\u201d [article before vowel sound \u201cO\u201d]\n\nI am also thinking about splitting up the \"make this arg optional\". Seems like a small and easy preparatory pull request?"
  },
  {
   "t": "2025-05-27T13:00:56Z",
   "kind": "review",
   "who": "naiyoma",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "a4c0eecc8fe38623958bf3422d58d170e66b0f3c",
   "text": "A summary of my understanding of this PR so far, regarding the `generateblock` changes: :\n- [x] Outputs and transactions are now optional.\n- [x] `generateblock` can now take an array of addresses and distribute the reward equally among them.\n- [x] `generateblock` with an empty array - in this case fallback to OP_TRUE\n- [ ] I think there's an intention to add a remainder \u2014 that way, it's possible to specify part of the reward to specific addresses and then split the remainder among the other addresses\n\nAdding how I  tested in case it's useful for other reviewers\n\n1. Generate 2 addresses\n```bash\nHASH=$(./build/bin/bitcoin-cli generateblock '[\"bcrt1qkqjkxltw5s89kkpxg0v9560nuh8c3alu04f6d6\", \"bcrt1qke6n4hcu4pl2fmv9ueklnn7fz6knum2n0qcnvc\"]' | jq -r .hash)\n\n# Verify that the reward is being split equally\n./build/bin/bitcoin-cli getrawtransaction $(./build/bin/bitcoin-cli getblock $HASH | jq -r .tx[0]) true | jq '.vout[] | select(.value > 0) | {address: .scriptPubKey.address, btc: .value}'\n```\n2. Test withan  empty array\n```bash\nHASH=$(./build/bin/bitcoin-cli generateblock '[]' | jq -r .hash)\nTXID=$(./build/bin/bitcoin-cli getblock $HASH | jq -r .tx[0])\n./build/bin/bitcoin-cli getrawtransaction $TXID true | jq '.vout'\n```\n3. still works with a single  address and a transaction\n```bash\nTXID=$(./build/bin/bitcoin-cli sendtoaddress $ADDRESS1 0.2)\nHASH=$(./build/bin/bitcoin-cli generateblock '[\"bcrt1qmvzwzg0hcym343w2u6gakqzp9s0kw2u964ga68\"]' \"[\\\"$TXID\\\"]\" | jq -r .hash)\n./build/bin/bitcoin-cli getblock $HASH | jq '.tx'\n```"
  },
  {
   "t": "2025-05-27T13:01:39Z",
   "kind": "review_comment",
   "who": "naiyoma",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": null,
   "text": "Delete this instead of commenting it out."
  },
  {
   "t": "2025-05-27T13:04:30Z",
   "kind": "review_comment",
   "who": "naiyoma",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": null,
   "text": "nit: Snake case is preferred for variables. https://github.com/bitcoin/bitcoin/blob/master/doc/developer-notes.md#coding-style-c"
  },
  {
   "t": "2025-05-28T22:59:28Z",
   "kind": "comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nWhy? I think it would be simpler to just require that at least one output address/descriptor is specified."
  },
  {
   "t": "2025-05-28T23:01:17Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": null,
   "text": "Although this RPC is only used by tests, I don't think we should be breaking backwards compatibility here. It's equally easy to determine whether this parameter is a string, so we can accept a string here for backwards compatibility.\n\nThe reason to keep compatibility is because this RPC has a high likelihood of being used in scripts and automated tests. Changing the type of the parameter will break all of those."
  },
  {
   "t": "2025-05-28T23:01:39Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": null,
   "text": "Descriptors are accepted too."
  },
  {
   "t": "2025-05-29T09:37:08Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2112898168,
   "text": "Is that possible without adding a new argument for single strings?"
  },
  {
   "t": "2025-05-29T16:01:58Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2112898168,
   "text": "Yes, see `verbose|verbosity` in `getblock` for example."
  },
  {
   "t": "2025-05-30T11:58:22Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "bd2c8b255ad1cc32505feec5b22e734f8592d4b3"
  },
  {
   "t": "2025-05-30T12:05:49Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "4ff4e0194ba6c850d53bba4e281fca5e69386228"
  },
  {
   "t": "2025-05-30T12:08:52Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2112898168,
   "text": "Done in 2c855694c795a31f13a473d6a6eb80c5d765e8ed\nThe change causes an error in the `rpc_help.py` functional test that I am unable to fix"
  },
  {
   "t": "2025-05-30T12:10:58Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2109130072,
   "text": "done thx"
  },
  {
   "t": "2025-05-30T13:11:53Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "2c855694c795a31f13a473d6a6eb80c5d765e8ed"
  },
  {
   "t": "2025-05-30T13:19:18Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "Rebased on top of master.\n\n2c855694c795a31f13a473d6a6eb80c5d765e8ed implements allowing single address or descriptor without using an array or json structure as sugested in https://github.com/bitcoin/bitcoin/pull/32468#discussion_r2112898168 and https://github.com/bitcoin/bitcoin/pull/32468#discussion_r2097722076. But makes `rpc_help.py` fail. (I still don't know why)"
  },
  {
   "t": "2025-06-05T09:52:52Z",
   "kind": "comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nThe cli tool needs to \"convert\" non-string args. However, if the overload accepts a string and a non-string, it is unclear how to proceed. Maybe similar to `hash_or_height`?"
  },
  {
   "t": "2025-06-09T16:44:05Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "00a5104ea984d75ae769a4af49d480272e8562f6"
  },
  {
   "t": "2025-06-09T16:46:33Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nI was trying to make the cli accept `bitcoin-cli generateblock address` but seems that the only way to do it is by requesting a json type object from the user `bitcoin-cli generateblock '\"address\"'` like `hash_or_height`"
  },
  {
   "t": "2025-06-09T17:00:53Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_generate.py",
   "commit": "8fb7e2ba591329f6899b7625843a508bf4287b60",
   "in_reply_to": null,
   "text": "This test fails for some unexpected reason.\nIt is unable to parse the address although is the same as the other tests, so format should be correct.\n`TestFramework (ERROR): Called Process failed with 'error: Error parsing JSON: bcrt1p9yfmy5h72durp7zrhlw9lf7jpwjgvwdg0jr0lqmmjtgg83266lqsekaqka`\n\nMaybe some of the functions used for parsing needs a lock to work correctly with concurrency?\n\nfriendly ping @maflcko for help here :)"
  },
  {
   "t": "2025-06-09T17:02:47Z",
   "kind": "review",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "00a5104ea984d75ae769a4af49d480272e8562f6",
   "text": "00a5104ea984d75ae769a4af49d480272e8562f6\nadded `outputs` param to the RPCConvertParams lists to make `rpc_help.py` test pass"
  },
  {
   "t": "2025-06-09T20:08:59Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_generate.py",
   "commit": "8fb7e2ba591329f6899b7625843a508bf4287b60",
   "in_reply_to": 2136087582,
   "text": "a \"naked\" address isn't valid json. This is just the same category of failure that was just discussed above"
  },
  {
   "t": "2025-06-09T20:16:22Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_generate.py",
   "commit": "8fb7e2ba591329f6899b7625843a508bf4287b60",
   "in_reply_to": 2136087582,
   "text": "It's the same value as in other tests that are working: See tests in lines 37, 48, 95, etc.\nThe value is declared in line 36 and it's never changed. It only fails in that test case."
  },
  {
   "t": "2025-06-09T20:25:59Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_generate.py",
   "commit": "8fb7e2ba591329f6899b7625843a508bf4287b60",
   "in_reply_to": 2136087582,
   "text": "Yes, but the others are not using `node.cli`. This is exactly https://github.com/bitcoin/bitcoin/pull/32468#issuecomment-2956338245\n\n`\"aa\"` is not equal to `aa`."
  },
  {
   "t": "2025-06-09T20:53:57Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "551f97cf6a84fa56de36b67650853fb0cd9752d7"
  },
  {
   "t": "2025-06-09T20:55:01Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_generate.py",
   "commit": "8fb7e2ba591329f6899b7625843a508bf4287b60",
   "in_reply_to": 2136087582,
   "text": "Oh you're right, I didn't know about `node.cli` difference.\nThanks for the help!"
  },
  {
   "t": "2025-06-11T23:03:42Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "f426866d00e9c85c435c21fee1cf84ca135d9005"
  },
  {
   "t": "2025-06-11T23:08:34Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "Rebased on top of master 5757de4ddd37f9321ee6b338b40888fd3561fc00 to fix conflicts"
  },
  {
   "t": "2025-06-12T06:37:14Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "d89b9008a9085f95dc84cd64b6010f3c0592bb3f"
  },
  {
   "t": "2025-06-12T07:53:23Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "7e8893cdb88ab6ff282847c405ab069241e0e0d6"
  },
  {
   "t": "2025-06-12T07:58:43Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "cdd082612f951f320c75828b2b3eda65b009afa1"
  },
  {
   "t": "2025-06-12T08:01:47Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "I think this is ready for review.\n\nCustom rewards split can be done in a followup. IMO, this PR by itself is ok.\n@lollerfirst is working on it here https://github.com/polespinasa/bitcoin/pull/1"
  },
  {
   "t": "2025-06-26T07:55:45Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "f7a09296544aece8baa8732115547e0e458af9c6"
  },
  {
   "t": "2025-06-26T07:56:26Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "Rebased on top of master e5f9218b6a"
  },
  {
   "t": "2025-07-17T17:04:24Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2109111837,
   "text": "[quoted text omitted]\n\nAny thoughts on this? Making it optional is a non-breaking change that should be easy to review."
  },
  {
   "t": "2025-08-18T20:58:43Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "52243063c1df4d1adf7b54e90e24026898914dad"
  },
  {
   "t": "2025-08-18T21:51:12Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "f5b31fa519dd63919be9c7897a446cd8b522243c"
  },
  {
   "t": "2025-08-18T22:13:38Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "19581ecf17234fdc4088d0473c7014f6f0b39418"
  },
  {
   "t": "2025-08-18T22:27:12Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "7f7abe315ae71e3f26f3135a900cd09c105e471a"
  },
  {
   "t": "2025-08-18T22:34:09Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "ea5c4f79f33f2070fca14719030c46dcc1d10886"
  },
  {
   "t": "2025-08-18T23:14:56Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "912d9cbfd1f60d3b8045c3d52cc28bfea8a033af"
  },
  {
   "t": "2025-08-18T23:54:23Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "847fd390884f6e7c2ecea9b48334a9687cfd7c06"
  },
  {
   "t": "2025-08-20T17:16:51Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "52257ede2de73efe43910985dd651428612a3e11"
  },
  {
   "t": "2025-08-20T17:33:42Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "adc76f791c7e7268edcd32e35a3caf90461e1287"
  },
  {
   "t": "2025-08-20T20:59:03Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "ae33a5625a391a4dca7384930ed2539f89e88be7"
  },
  {
   "t": "2025-08-20T22:08:20Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5"
  },
  {
   "t": "2025-08-31T10:45:45Z",
   "kind": "review_comment",
   "who": "naiyoma",
   "assoc": "MEMBER",
   "path": "src/rpc/client.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": null,
   "text": "I\u2019d suggest removing this instead of commenting it out."
  },
  {
   "t": "2025-09-05T18:19:45Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/rpc/client.cpp",
   "commit": "0d55bc486e41855f4125fa9f55c3d31483403cb5",
   "in_reply_to": 2312399866,
   "text": "Forgot to :)\nAnyway I think this PR needs to wait for https://github.com/bitcoin/bitcoin/pull/33230 to get merged. In that case this line can come back."
  },
  {
   "t": "2025-09-26T00:05:46Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "1bf2edb113c656595d352d7559d6d9546898aba3"
  },
  {
   "t": "2025-09-26T00:07:02Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "Rebased on top of master (after #33230 was merged).\n\nThe diff is simple (plus some changes in test file):\n```diff\ndiff --git a/src/rpc/client.cpp b/src/rpc/client.cpp\nindex 320823b1c1..acbdc14db8 100644\n--- a/src/rpc/client.cpp\n+++ b/src/rpc/client.cpp\n@@ -37,7 +37,7 @@ static const CRPCConvertParam vRPCConvertParams[] =\n     { \"generatetoaddress\", 2, \"maxtries\" },\n     { \"generatetodescriptor\", 0, \"num_blocks\" },\n     { \"generatetodescriptor\", 2, \"maxtries\" },\n-    //{ \"generateblock\", 0, \"outputs\"},\n+    { \"generateblock\", 0, \"outputs\", /*also_string=*/true},\n     { \"generateblock\", 1, \"transactions\" },\n     { \"generateblock\", 2, \"submit\" },\n     { \"getnetworkhashps\", 0, \"nblocks\" },\n```\n\n```diff\n--- a/src/rpc/mining.cpp\n+++ b/src/rpc/mining.cpp\n@@ -343,13 +343,14 @@ static RPCHelpMan generateblock()\n {\n     UniValue address_or_descriptor = UniValue(UniValue::VARR);\n     UniValue parsed;\n-    if (!request.params[0].isNull() && parsed.read(request.params[0].get_str())) {\n-        if (!parsed.isArray()) {\n+    if (!request.params[0].isNull()) {\n+        if (request.params[0].isArray()) {\n+            address_or_descriptor = request.params[0].get_array();\n+        } else if (request.params[0].isStr()){\n+            address_or_descriptor.push_back(request.params[0]);\n+        } else {\n             throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, \"Error: Invalid address or descriptor\");\n         }\n-        address_or_descriptor = parsed.get_array();\n-    } else if (!request.params[0].isNull()) {\n-        address_or_descriptor.push_back(request.params[0]);\n     }\n\n```"
  },
  {
   "t": "2025-09-26T19:25:19Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "ee72e34bda3d5797e2753f359361048ac3270463"
  },
  {
   "t": "2025-09-26T20:07:43Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "30244fb3417f92d19142de46008232acb4ab4e7c"
  },
  {
   "t": "2026-02-24T19:11:57Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "46bbf198e8127a47d8e34554954a478d47880075"
  },
  {
   "t": "2026-02-24T19:22:11Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "Rebased to fix some conflicts and silent conflicts with master"
  },
  {
   "t": "2026-03-22T17:47:19Z",
   "kind": "review_comment",
   "who": "andrewtoth",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "15831393176047b17c835b6ebd1a969ef570647b",
   "in_reply_to": null,
   "text": "We should update the description to mention multiple outputs."
  },
  {
   "t": "2026-03-22T17:48:51Z",
   "kind": "review_comment",
   "who": "andrewtoth",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "55bcd94ff3bb1b3679704eae157f13be78aa54c7",
   "in_reply_to": null,
   "text": "This if block can be combined with the below `!mine_mempool` block. No need to have two `if`s if we are setting `mine_mempool = false;` unconditionally in here."
  },
  {
   "t": "2026-03-22T17:51:35Z",
   "kind": "review_comment",
   "who": "andrewtoth",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "8fb7e2ba591329f6899b7625843a508bf4287b60",
   "in_reply_to": null,
   "text": "Why don't we want to have an array of `{ address: amount }` objects, like we do for other RPCs, and just burn the rest of the reward if there's not enough total amount?"
  },
  {
   "t": "2026-03-22T17:53:52Z",
   "kind": "review_comment",
   "who": "andrewtoth",
   "assoc": "MEMBER",
   "path": "test/functional/feature_assumeutxo.py",
   "commit": "15831393176047b17c835b6ebd1a969ef570647b",
   "in_reply_to": null,
   "text": "I think the only thing we should touch in the existing functional tests is renaming `output` -> `outputs`. Otherwise this should be backwards compatible, and mining the mempool instead of an empty block can be a behavior change in the tests."
  },
  {
   "t": "2026-03-25T07:45:01Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "8fb7e2ba591329f6899b7625843a508bf4287b60",
   "in_reply_to": 2971836817,
   "text": "This was an option taken by @a1denvalu3 here https://github.com/polespinasa/bitcoin/pull/1\nBut I think he is not working on it anymore. I have to go re-check it, it's been a while."
  },
  {
   "t": "2026-03-25T07:50:29Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "15831393176047b17c835b6ebd1a969ef570647b",
   "in_reply_to": 2971831333,
   "text": "done thanks"
  },
  {
   "t": "2026-03-25T07:50:35Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/rpc/mining.cpp",
   "commit": "55bcd94ff3bb1b3679704eae157f13be78aa54c7",
   "in_reply_to": 2971833404,
   "text": "true, done"
  },
  {
   "t": "2026-03-25T07:51:33Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "test/functional/feature_assumeutxo.py",
   "commit": "15831393176047b17c835b6ebd1a969ef570647b",
   "in_reply_to": 2971839554,
   "text": "As this suggest https://github.com/bitcoin/bitcoin/pull/32468#discussion_r2106232962 the `raw(aaa)` can be removed to just fallback on the OP_RETURN.\nAnd doing `outputs=[]` or not adding `outputs` at all is the same, so there's no need to keep it.\n\nI will add back the `transactions=[]` you are right that is a behavior change and this PR should not be changing that. Thanks."
  },
  {
   "t": "2026-03-25T08:12:12Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "629565c8fc03f22e069e1142c5a1731b073ec414"
  },
  {
   "t": "2026-03-25T08:13:59Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "Force pushed to apply some of @andrewtoth suggestions as they were fast to implement.\nAnd rebased on top of master.\n\nI need to take some time to implement the split reward option proposed here https://github.com/bitcoin/bitcoin/pull/32468#discussion_r2971836817 and already been worked on here https://github.com/polespinasa/bitcoin/pull/1."
  },
  {
   "t": "2026-03-25T08:24:21Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "dd268b257d0f87fc042c330a0d23a6471ef4d3f6"
  },
  {
   "t": "2026-04-02T18:06:08Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "9d7fd644a1e0c2827881a60bc11c521b2f6ae7d5"
  },
  {
   "t": "2026-04-18T20:11:17Z",
   "kind": "comment",
   "who": "sedited",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nIs this supposed to be implemented here now?"
  },
  {
   "t": "2026-04-20T14:59:36Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nAs mentioned before https://github.com/bitcoin/bitcoin/pull/32468#issuecomment-2965555591, I think this PR is good as is and custom rewards split can be implemented in a follow-up PR. Unless reviewers consider it must be included in this PR, in that case I will be happy to work on it here."
  },
  {
   "t": "2026-04-21T15:10:31Z",
   "kind": "comment",
   "who": "stickies-v",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nCustom rewards are the general solution, why not just implement that right away? It's useful to keep the CLI commands ergonomic, but I think it's a mistake to handicap the RPC interface just to make CLI more ergonomic. The RPC interface should be maximally useful on its own.\n\nIt also looks like this work should be split up in multiple commits, I think the `outputs` changes and the mempool changes are orthogonal?"
  },
  {
   "t": "2026-05-18T17:32:02Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "8fb7e2ba591329f6899b7625843a508bf4287b60"
  },
  {
   "t": "2026-05-18T20:36:34Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "6e2dc3e533eac184570743a08e10dc1a298ac270"
  },
  {
   "t": "2026-05-18T21:37:04Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "03dcd180433b20289ac49f19ed12900e2c632cbf"
  },
  {
   "t": "2026-05-18T21:42:30Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nWorking on it. Idk why I structured it so bad in the first place \ud83d\ude05\n\n[quoted text omitted]\nFair enough, on it :)\nWas giving time to be done in https://github.com/polespinasa/bitcoin/pull/1, but I don't think it's coming soon"
  },
  {
   "t": "2026-05-19T21:00:36Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "addc3cd9a453ad0fe343e1eaa93ac4a786f1dca5"
  },
  {
   "t": "2026-05-19T21:04:42Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "0059a7b0d9a2e3eb074a1e880a4b56cea03d9351"
  },
  {
   "t": "2026-05-20T13:27:54Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "Moved to draft while working on custom rewards and cleaning the commit structure"
  },
  {
   "t": "2026-08-27T11:16:19Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "d31d637a6dfbdb55ad6fb948b04599e1edecade2"
  },
  {
   "t": "2026-08-27T11:24:24Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "261fd699de100b213ddfd088ddca1567809aba38"
  },
  {
   "t": "2026-09-16T15:06:34Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "55bcd94ff3bb1b3679704eae157f13be78aa54c7"
  },
  {
   "t": "2026-09-16T18:32:18Z",
   "kind": "force_push",
   "who": "polespinasa",
   "commit": "1f1c5fd6fa177c71405fa748e8e5c5ee53b73332"
  },
  {
   "t": "2026-09-16T18:35:09Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "Marking this as ready for review.\nBicaru20 implemented the custom split rewards.\n\nThe PR was also rebased on top of master and corrected some nits and inconsistencies that I found."
  }
 ],
 "labels_log": [
  {
   "t": "2025-05-10T17:34:43Z",
   "action": "labeled",
   "label": "RPC/REST/ZMQ",
   "who": "DrahtBot"
  },
  {
   "t": "2025-05-10T17:48:08Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-05-10T19:05:39Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-05-12T08:55:31Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-05-12T10:27:04Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-05-20T09:44:32Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-05-20T12:33:44Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-05-30T03:25:50Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-06-09T22:19:48Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-06-11T22:19:33Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-06-12T00:38:15Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-06-12T07:53:37Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-06-12T08:57:33Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-06-25T23:17:09Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-06-26T09:54:23Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-07-18T15:14:47Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-08-18T21:51:24Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-08-18T22:41:52Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-08-20T23:59:48Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-03T00:02:21Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-24T19:45:50Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-03-31T17:43:38Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-04-02T19:51:53Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-17T18:24:38Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-18T18:11:22Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-18T21:30:10Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-19T06:28:23Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-19T21:05:58Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-19T22:33:31Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-27T11:24:53Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-27T12:57:56Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  }
 ],
 "state_log": [
  {
   "t": "2025-05-12T09:28:30Z",
   "kind": "renamed",
   "who": "polespinasa",
   "from": "rpc:generatetomany",
   "to": "rpc: generatetomany"
  },
  {
   "t": "2025-05-25T10:34:08Z",
   "kind": "renamed",
   "who": "polespinasa",
   "from": "rpc: generatetomany",
   "to": "rpc: generateblock to allow multiple outputs"
  },
  {
   "t": "2026-05-20T13:27:28Z",
   "kind": "convert_to_draft",
   "who": "polespinasa"
  },
  {
   "t": "2026-09-16T18:34:09Z",
   "kind": "ready_for_review",
   "who": "polespinasa"
  }
 ],
 "text_chars": 26902,
 "text_tokens_estimate": 6725,
 "changed_paths": [
  "doc/release-notes-32468.md",
  "src/rpc/client.cpp",
  "src/rpc/mining.cpp",
  "test/functional/feature_assumeutxo.py",
  "test/functional/feature_block.py",
  "test/functional/feature_fastprune.py",
  "test/functional/mempool_sigoplimit.py",
  "test/functional/mempool_truc.py",
  "test/functional/mempool_updatefromblock.py",
  "test/functional/p2p_outbound_eviction.py",
  "test/functional/rpc_blockchain.py",
  "test/functional/rpc_generate.py",
  "test/functional/rpc_getblockstats.py",
  "test/functional/rpc_txoutproof.py",
  "test/functional/wallet_bumpfee.py"
 ],
 "files": [
  {
   "path": "doc/release-notes-32468.md",
   "add": 5,
   "del": 0
  },
  {
   "path": "src/rpc/client.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/rpc/mining.cpp",
   "add": 125,
   "del": 37
  },
  {
   "path": "test/functional/feature_assumeutxo.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/feature_block.py",
   "add": 2,
   "del": 2
  },
  {
   "path": "test/functional/feature_fastprune.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/mempool_sigoplimit.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/mempool_truc.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/mempool_updatefromblock.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/p2p_outbound_eviction.py",
   "add": 5,
   "del": 5
  },
  {
   "path": "test/functional/rpc_blockchain.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/rpc_generate.py",
   "add": 118,
   "del": 3
  },
  {
   "path": "test/functional/rpc_getblockstats.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/rpc_txoutproof.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/wallet_bumpfee.py",
   "add": 1,
   "del": 1
  }
 ],
 "test_lines": 153,
 "git": {
  "head": "1f1c5fd6fa177c71405fa748e8e5c5ee53b73332",
  "head_matches_backup": true,
  "base": "b2a3ca3df901dcc19b07f7dcf3115d8f7835b931",
  "commits": [
   {
    "sha": "73b2e695b1",
    "subject": "rpc: Expand generateblock transactions argument options",
    "files": 1,
    "add": 28,
    "del": 26
   },
   {
    "sha": "1725069202",
    "subject": "test: expand generateblock test coverage",
    "files": 1,
    "add": 34,
    "del": 1
   },
   {
    "sha": "fdf493625e",
    "subject": "rpc: add multiple outputs to generateblock",
    "files": 2,
    "add": 64,
    "del": 12
   },
   {
    "sha": "ef11794891",
    "subject": "test: add custom outputs test coverage for generateblock",
    "files": 12,
    "add": 38,
    "del": 17
   },
   {
    "sha": "e71d9dd923",
    "subject": "rpc: add custom split reward to generateblock",
    "files": 1,
    "add": 44,
    "del": 9
   },
   {
    "sha": "da81307509",
    "subject": "test: add test coverage for custom reward of generateblock",
    "files": 1,
    "add": 62,
    "del": 1
   },
   {
    "sha": "1f1c5fd6fa",
    "subject": "Add release notes",
    "files": 1,
    "add": 5,
    "del": 0
   }
  ],
  "patch_truncated": false
 },
 "input_hash": "392af45e9f8b3624",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}