{
 "number": 36481,
 "input_hash": "79768378a1e7cd63",
 "model": "ledger",
 "prompt_hash": null,
 "created": "2026-10-28T01:23:57+00:00",
 "result": {
  "summary": "Adds a `rebroadcastwallettx` RPC method and a GUI context menu action to allow manual rebroadcasting of unconfirmed wallet transactions. The wallet extracts broadcast eligibility checks into a helper and submits the transaction to the mempool with immediate peer broadcast. It exposes these checks through the node-wallet interface to enable or disable the GUI context menu action.",
  "problem": "Users have no direct way in the wallet interface or RPC to manually rebroadcast an unconfirmed transaction that failed to propagate or dropped out of mempools. Today, doing so requires extracting the raw transaction hex and invoking `sendrawtransaction`.",
  "card": "Adds a rebroadcastwallettx RPC command and a GUI context menu item allowing users to manually rebroadcast an unconfirmed wallet transaction by txid. Previously, manual rebroadcast required fetching the raw transaction hex and submitting it via sendrawtransaction. The wallet validates eligibility by ensuring the transaction is not abandoned, coinbase, or confirmed before submitting it to the mempool and relaying it to all peers. The addition was motivated by broader transaction rebroadcasting discussions in issue 36403.",
  "evidence": [
   "PR description: 'From the discussion in #36403, it is clear that there needs to be a way for users to rebroadcast a transaction. Currently, the way to do so requires getting the raw transaction, getting the hex, and using `sendrawtransaction`.'"
  ],
  "scope_notes": "",
  "changed_since_previous": "Diff provided; commits and functionality are unchanged.",
  "thread": {
   "last_event_at": "2026-10-27T14:03:41Z",
   "events": 14,
   "head_sha": "648450039ab1c93f5e0001e0829f094ca41d2bae",
   "schema_floor": 2,
   "schema": 2
  },
  "waiting_on": [
   {
    "at": "2026-10-25",
    "id": "r:5642981631",
    "on": "author",
    "url": "https://github.com/bitcoin/bitcoin/pull/36481#pullrequestreview-5642981631",
    "what": "addressing fametrano's objection regarding feerate exceeding -maxfeerate"
   },
   {
    "at": "2026-10-27",
    "id": "r:5665738041",
    "on": "author",
    "url": "https://github.com/bitcoin/bitcoin/pull/36481#pullrequestreview-5665738041",
    "what": "responding to vasild's review comments and question"
   }
  ],
  "risk": {
   "level": "medium",
   "touches": [
    "wallet",
    "rpc_api",
    "gui"
   ],
   "why": "A bug in rebroadcast eligibility or submission logic could broadcast unwanted, abandoned, or conflicted transactions across the network."
  },
  "discussion": {
   "author_status": "last statement processed 2026-10-27",
   "open_concerns": [
    "fametrano: rebroadcastwallettx fails with code -1 and an empty message when the transaction feerate exceeds -maxfeerate",
    "vasild: what is the purpose of the ampersand in menu items like 'Re&broadcast'?",
    "vasild: extend TransactionCanBeBroadcast() to return the specific reason why a transaction cannot be broadcast",
    "vasild: throw a JSONRPCError instead of returning null when no wallet is found",
    "vasild: add a sentence directing users to listtransactions RPC in the help text"
   ],
   "resolved_concerns": []
  },
  "reviewability": {
   "state": "Ready",
   "label": "CI failing",
   "reason": "CI is red; check whether the failure is the PR's before a deep review."
  },
  "agreement": {
   "state": "Blocked",
   "summary": "Blocked: objection that needs a change, nobody has replied (fametrano)",
   "reason": "vasild gave an Approach ACK and opened several review comments, including a question regarding Qt menu accelerators and suggestions on error handling and RPC documentation.",
   "evidence": [
    "fametrano (objection, correctness, must be changed, open): rebroadcastwallettx fails with code -1 and an empty message when the transaction feerate exceeds -maxfeerate",
    "vasild (question, interface, must be answered, open): what is the purpose of the ampersand in menu items like 'Re&broadcast'?",
    "vasild (suggestion, interface, must be answered, open): extend TransactionCanBeBroadcast() to return the specific reason why a transaction cannot be broadcast",
    "vasild (suggestion, interface, must be answered, open): throw a JSONRPCError instead of returning null when no wallet is found",
    "vasild (suggestion, interface, must be answered, open): add a sentence directing users to listtransactions RPC in the help text",
    "polespinasa: Concept ACK",
    "mzumsande: Concept ACK \u2014 giving the users the option to rebroadcast transactions manually is useful in all scenarios",
    "murchandamus: Concept ACK",
    "jpk68: Concept ACK",
    "fametrano: Concept ACK",
    "vasild: Approach ACK"
   ],
   "objections": [
    {
     "reviewer": "fametrano",
     "association": "NONE",
     "type": "objection",
     "kind": "correctness",
     "harm": "rebroadcastwallettx fails with code -1 and an empty message when the transaction feerate exceeds -maxfeerate",
     "request": "",
     "question": "",
     "text": "rebroadcastwallettx fails with code -1 and an empty message when the transaction feerate exceeds -maxfeerate",
     "clears_with": "change",
     "blocking": true,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-25: 'rebroadcastwallettx fails with code -1 and an empty message when the transaction is out of the mempool and its feerate is above the wallet's `-maxfeerate`'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36481#pullrequestreview-5642981631",
     "id": "r:5642981631",
     "at": "2026-10-25",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "vasild",
     "association": "MEMBER",
     "type": "question",
     "kind": "interface",
     "harm": "",
     "request": "",
     "question": "what is the purpose of the ampersand in menu items like 'Re&broadcast'?",
     "text": "what is the purpose of the ampersand in menu items like 'Re&broadcast'?",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-27: 'What is the `&` in `Re&broadcast`? It is also in `A&bandon`.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36481#discussion_r4387718797",
     "id": "rc:4387718797",
     "at": "2026-10-27",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "vasild",
     "association": "MEMBER",
     "type": "suggestion",
     "kind": "interface",
     "harm": "",
     "request": "extend TransactionCanBeBroadcast() to return the specific reason why a transaction cannot be broadcast",
     "question": "",
     "text": "extend TransactionCanBeBroadcast() to return the specific reason why a transaction cannot be broadcast",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-27: 'Consider extending `TransactionCanBeBroadcast()` to return the reason why the transaction can not be broadcast:'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36481#discussion_r4389337972",
     "id": "rc:4389337972",
     "at": "2026-10-27",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "vasild",
     "association": "MEMBER",
     "type": "suggestion",
     "kind": "interface",
     "harm": "",
     "request": "throw a JSONRPCError instead of returning null when no wallet is found",
     "question": "",
     "text": "throw a JSONRPCError instead of returning null when no wallet is found",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-27: 'Should we not throw here? `UniValue::VNULL` is for \"If rebroadcast is successfully initiated\".'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36481#discussion_r4389395895",
     "id": "rc:4389395895",
     "at": "2026-10-27",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    },
    {
     "reviewer": "vasild",
     "association": "MEMBER",
     "type": "suggestion",
     "kind": "interface",
     "harm": "",
     "request": "add a sentence directing users to listtransactions RPC in the help text",
     "question": "",
     "text": "add a sentence directing users to listtransactions RPC in the help text",
     "clears_with": "answer",
     "blocking": false,
     "status": "open",
     "status_note": "",
     "cleared": false,
     "author_replied": false,
     "others_replied": false,
     "fix_pushed": false,
     "replies": [],
     "evidence": "2026-10-27: 'I think it would be useful to add the sentence `Use the listtransactions RPC to see the wallet transactions` here.'",
     "url": "https://github.com/bitcoin/bitcoin/pull/36481#discussion_r4389410912",
     "id": "rc:4389410912",
     "at": "2026-10-27",
     "status_at": null,
     "status_by": null,
     "resolution_evidence": "",
     "pin": null,
     "from_schema": 2
    }
   ],
   "support": [
    {
     "reviewer": "polespinasa",
     "reason": "",
     "substantive": false,
     "verdict": "Concept ACK",
     "id": "c:6070262862",
     "url": "https://github.com/bitcoin/bitcoin/pull/36481#issuecomment-6070262862",
     "at": "2026-10-08",
     "association": "MEMBER",
     "evidence": "none",
     "areas": []
    },
    {
     "reviewer": "mzumsande",
     "reason": "giving the users the option to rebroadcast transactions manually is useful in all scenarios",
     "substantive": true,
     "verdict": "Concept ACK",
     "id": "r:5472173546",
     "url": "https://github.com/bitcoin/bitcoin/pull/36481#pullrequestreview-5472173546",
     "at": "2026-10-09",
     "association": "MEMBER",
     "evidence": "none",
     "areas": []
    },
    {
     "reviewer": "murchandamus",
     "reason": "",
     "substantive": false,
     "verdict": "Concept ACK",
     "id": "c:6324896461",
     "url": "https://github.com/bitcoin/bitcoin/pull/36481#issuecomment-6324896461",
     "at": "2026-10-21",
     "association": "MEMBER",
     "evidence": "none",
     "areas": []
    },
    {
     "reviewer": "jpk68",
     "reason": "",
     "substantive": false,
     "verdict": "Concept ACK",
     "id": "c:6329654439",
     "url": "https://github.com/bitcoin/bitcoin/pull/36481#issuecomment-6329654439",
     "at": "2026-10-22",
     "association": "CONTRIBUTOR",
     "evidence": "none",
     "areas": []
    },
    {
     "reviewer": "fametrano",
     "reason": "",
     "substantive": false,
     "verdict": "Concept ACK",
     "id": "r:5642981631",
     "url": "https://github.com/bitcoin/bitcoin/pull/36481#pullrequestreview-5642981631",
     "at": "2026-10-25",
     "association": "NONE",
     "evidence": "none",
     "areas": []
    },
    {
     "reviewer": "vasild",
     "reason": "",
     "substantive": false,
     "verdict": "Approach ACK",
     "id": "r:5665738041",
     "url": "https://github.com/bitcoin/bitcoin/pull/36481#pullrequestreview-5665738041",
     "at": "2026-10-27",
     "association": "MEMBER",
     "evidence": "none",
     "areas": []
    }
   ],
   "participants": [
    {
     "login": "polespinasa",
     "stance": "support",
     "note": "Concept ACK",
     "association": "MEMBER",
     "comments": 1,
     "first": "2026-10-08",
     "last": "2026-10-08"
    },
    {
     "login": "mzumsande",
     "stance": "support",
     "note": "Concept ACK: manual rebroadcast is useful regardless of the ultimate rebroadcast solution",
     "association": "MEMBER",
     "comments": 1,
     "first": "2026-10-09",
     "last": "2026-10-09"
    },
    {
     "login": "murchandamus",
     "stance": "support",
     "note": "Concept ACK",
     "association": "MEMBER",
     "comments": 1,
     "first": "2026-10-21",
     "last": "2026-10-21"
    },
    {
     "login": "jpk68",
     "stance": "support",
     "note": "Concept ACK",
     "association": "CONTRIBUTOR",
     "comments": 1,
     "first": "2026-10-22",
     "last": "2026-10-22"
    },
    {
     "login": "fametrano",
     "stance": "objection",
     "note": "Concept ACK, but noted that rebroadcastwallettx fails with an empty error message when feerate exceeds -maxfeerate",
     "association": "NONE",
     "comments": 1,
     "first": "2026-10-25",
     "last": "2026-10-25"
    },
    {
     "login": "vasild",
     "stance": "support",
     "note": "Approach ACK, suggested improvements to error reporting and RPC handling",
     "association": "MEMBER",
     "comments": 9,
     "first": "2026-10-27",
     "last": "2026-10-27"
    }
   ],
   "derivation": "objection that needs a change, nobody has replied (fametrano)",
   "model_state": null,
   "corrections": [],
   "notes": "vasild gave an Approach ACK and opened several review comments, including a question regarding Qt menu accelerators and suggestions on error handling and RPC documentation."
  },
  "dependencies": {
   "depends_on": [],
   "enables": []
  },
  "categories": [
   {
    "name": "ipc",
    "member": false,
    "evidence": "Touches src/interfaces/wallet.h only to expose transaction eligibility checks to the GUI, which the category explicitly excludes when interface mechanics are not the point.",
    "band": "Unranked",
    "reason_tag": "new feature",
    "score": 0.0,
    "factors": {
     "bug_severity": 0,
     "leverage": 0,
     "performance": 0,
     "security_stability": 0,
     "user_value": 2
    },
    "rationale": "Non-member: adding a method to interfaces::Wallet to support wallet/GUI functionality is not an IPC PR."
   },
   {
    "name": "rpc",
    "member": false,
    "evidence": "Wallet RPCs belong to wallet unless altering the RPC machinery itself, and no RPC area label is present.",
    "band": "Unranked",
    "reason_tag": "new feature",
    "score": 0.0,
    "factors": {
     "bug_severity": 0,
     "leverage": 0,
     "performance": 0,
     "security_stability": 0,
     "user_value": 2
    },
    "rationale": "This PR adds a wallet-specific endpoint (`rebroadcastwallettx`) rather than modifying RPC framework machinery."
   },
   {
    "name": "wallet",
    "member": true,
    "evidence": "Implements a new wallet RPC rebroadcastwallettx, exposes wallet rebroadcast eligibility logic, and adds a GUI context menu action.",
    "band": "P3",
    "reason_tag": "new feature",
    "score": 0.45,
    "factors": {
     "bug_severity": 0,
     "leverage": 0,
     "performance": 0,
     "security_stability": 0,
     "user_value": 2
    },
    "rationale": "Adds a direct RPC and GUI mechanism for users to rebroadcast unconfirmed wallet transactions without manual hex extraction. As noted in the description, 'there needs to be a way for users to rebroadcast a transaction' without having to resort to getting the hex and calling sendrawtransaction; this is a clear user-facing improvement that remains reasonably deferrable."
   }
  ],
  "confidence": "high",
  "uncertainties": [],
  "needs": []
 },
 "cost_usd": 0.0,
 "source": {
  "record": "2026-10-28T01:23:57+00:00",
  "code": "2026-10-10T01:25:41+00:00",
  "judgments": 3
 }
}