{
 "number": 29278,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/29278",
 "title": "Wallet:  Add `maxfeerate` wallet startup option",
 "author": "ismaelsadeeq",
 "author_association": "MEMBER",
 "created_at": "2024-01-18T22:23:49Z",
 "updated_at": "2026-09-15T17:23:23Z",
 "age_days": 972,
 "draft": false,
 "labels": [
  "Wallet",
  "RPC/REST/ZMQ"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
 "head_ref": "01-2024-maxfeerate-fix",
 "head_repo": "ismaelsadeeq/bitcoin",
 "head_history": [
  {
   "t": "2024-01-25T21:29:45Z",
   "sha": "b9f2ddc0b1e42c2fdca68c7db5cd241ed3214e62"
  },
  {
   "t": "2024-01-25T21:53:11Z",
   "sha": "0c9e0c5b2218c154b62275794b878af7e1457647"
  },
  {
   "t": "2024-01-31T12:40:13Z",
   "sha": "d4dceeafc2292cd050cb10e308d73bc8ef84201a"
  },
  {
   "t": "2024-02-05T07:36:04Z",
   "sha": "3080c00e68440d0bde604a87b8f8e3fb3fa31ee8"
  },
  {
   "t": "2024-02-05T07:38:09Z",
   "sha": "4358cb0b67dedf346185cfd8e49ad818b5fed722"
  },
  {
   "t": "2024-02-05T07:42:28Z",
   "sha": "f5b21e8f1d5ef096a9c186ec6f881b42ade9c684"
  },
  {
   "t": "2024-02-05T08:30:21Z",
   "sha": "d1eabac320a09a18cd50d2c08624220f3f92fd4e"
  },
  {
   "t": "2024-02-05T09:19:35Z",
   "sha": "a5d10367cf832497af2ac72f8c2c42dd25398c63"
  },
  {
   "t": "2024-02-08T13:22:11Z",
   "sha": "1fae882f98205afb05e96432ce57212226bc0909"
  },
  {
   "t": "2024-02-13T09:19:07Z",
   "sha": "bf6fc126d1e0b37e490d38124945fa4e8f7475f4"
  },
  {
   "t": "2024-02-27T10:21:21Z",
   "sha": "3c77b11d910617239da66c5f2853a1b366c0e6bb"
  },
  {
   "t": "2024-02-27T10:38:27Z",
   "sha": "879c048543b1f0239b4650dd0eea2f5215877916"
  },
  {
   "t": "2024-03-05T17:11:16Z",
   "sha": "f91accef277bbeb6f957b98f97d2febe618e7142"
  },
  {
   "t": "2024-03-12T20:03:55Z",
   "sha": "597665e5cd90db71d66e61020722fd2787b88ff3"
  },
  {
   "t": "2024-03-18T10:27:09Z",
   "sha": "cb74e58d6deef3aeaabf1c236ad73a3e11b117f6"
  },
  {
   "t": "2024-03-18T11:07:46Z",
   "sha": "50d2a010fcd57b58537b711846340c68f6614720"
  },
  {
   "t": "2024-06-25T11:21:15Z",
   "sha": "f6d9ca3392ae38b0123d9ab339cc9908f65c15f6"
  },
  {
   "t": "2024-07-03T12:51:51Z",
   "sha": "e5d1d25912390954b1a064c5c1f9c5d2c1726430"
  },
  {
   "t": "2025-01-23T19:28:10Z",
   "sha": "970aba08d83af03242bdf658b152c7724ce74947"
  },
  {
   "t": "2025-01-23T19:41:41Z",
   "sha": "46f0bc5b485130d3e7d14e6855d81d387950cb39"
  },
  {
   "t": "2025-02-20T21:33:23Z",
   "sha": "6dec2d4fed3c6ca8ebef05988fded44ad9051a77"
  },
  {
   "t": "2025-03-18T10:54:20Z",
   "sha": "258a7fafe32bb19f838a32d4a6dea3b11e42aaf0"
  },
  {
   "t": "2025-05-08T19:09:02Z",
   "sha": "31a16093156e1fe5b47c9150f41ccc0012fbb479"
  },
  {
   "t": "2025-05-13T17:13:33Z",
   "sha": "c2db2185523aec53bcb64480c5782de28aa36f4d"
  },
  {
   "t": "2025-08-12T09:11:52Z",
   "sha": "908710d008818677b1c3c728cedf46aa72d902d1"
  },
  {
   "t": "2025-08-12T09:16:33Z",
   "sha": "29db50da2d6286f49cc603befb60c2f4bea280b0"
  },
  {
   "t": "2025-08-12T09:21:43Z",
   "sha": "b592d276923a8a9abb795ec5a7c8a6129534b929"
  },
  {
   "t": "2025-08-13T10:49:40Z",
   "sha": "4d6de3cd80bbf96f54bff4f1be9ddd79465f4ca3"
  },
  {
   "t": "2025-09-01T14:28:33Z",
   "sha": "55c3e5da052268f9a2d5026cce7a74a131d85366"
  },
  {
   "t": "2025-09-01T20:30:04Z",
   "sha": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d"
  },
  {
   "t": "2025-11-12T17:01:20Z",
   "sha": "ef00ee9b41dde3ccc37a0a865bc967f94314eae4"
  },
  {
   "t": "2026-01-22T14:05:12Z",
   "sha": "92ea90598fb00746b2e92bb2c280838e36ad0c46"
  },
  {
   "t": "2026-01-28T14:56:45Z",
   "sha": "282007d36381c34a98f3caf4c92666c15192415d"
  },
  {
   "t": "2026-02-05T12:15:28Z",
   "sha": "85ebfc485bd46f061b19902dc4ccb2dbf58bd5fe"
  },
  {
   "t": "2026-02-13T16:54:54Z",
   "sha": "9255efbe49a63155ced9facc3eeb42ed7c1bddc1"
  },
  {
   "t": "2026-02-24T22:49:28Z",
   "sha": "d4f54060eab53523f853b2f1b1a6895b62b7d9e7"
  },
  {
   "t": "2026-05-29T09:06:23Z",
   "sha": "6441f4fdd6c8c3aa04b53f2c23a72ee0a07db396"
  },
  {
   "t": "2026-05-29T11:17:16Z",
   "sha": "440508a15deeee99613d80311581629fcf81e6c7"
  },
  {
   "t": "2026-07-01T11:19:31Z",
   "sha": "ecd1e5daf6f260b585a8f12d5e9891827c66ce8a"
  },
  {
   "t": "2026-07-01T16:50:12Z",
   "sha": "6f05410067d3c34c9b37f741bf040d4f32a2cb34"
  },
  {
   "t": "2026-07-03T16:37:16Z",
   "sha": "d46adaaaaa756627ca28fb1088a8938fa4cea2dc"
  },
  {
   "t": "2026-08-05T12:26:31Z",
   "sha": "4da7a2f4d962797018a26031da65c518039e7d7b"
  },
  {
   "t": "2026-08-14T21:48:57Z",
   "sha": "394e29b3a508a4bf725df40675f54a80760e0d7a"
  },
  {
   "t": "2026-09-13T19:46:03Z",
   "sha": "e83e86d4fa52f1372d5f7de582abde15a2eadbe3"
  },
  {
   "t": "2026-09-15T12:12:17Z",
   "sha": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9"
  }
 ],
 "additions": 303,
 "deletions": 79,
 "changed_files": 30,
 "commit_count": 9,
 "size_bucket": "M",
 "mergeable_state": "clean",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {
    "ack": [
     {
      "login": "polespinasa",
      "url": "https://github.com/bitcoin/bitcoin/pull/29278#pullrequestreview-5213483629"
     }
    ],
    "stale_ack": [
     {
      "login": "josibake",
      "url": "https://github.com/bitcoin/bitcoin/pull/29278#issuecomment-1968930832"
     },
     {
      "login": "murchandamus",
      "url": "https://github.com/bitcoin/bitcoin/pull/29278#issuecomment-2610935741"
     },
     {
      "login": "achow101",
      "url": "https://github.com/bitcoin/bitcoin/pull/29278#pullrequestreview-3759991755"
     },
     {
      "login": "furszy",
      "url": "https://github.com/bitcoin/bitcoin/pull/29278#pullrequestreview-3780628607"
     }
    ]
   },
   "conflicts": [
    {
     "number": 35752,
     "title": "wallet: make encryption state updates atomic",
     "author": "l0rinc"
    },
    {
     "number": 35713,
     "title": "Remove boost as a unit test runner",
     "author": "rustaceanrob"
    },
    {
     "number": 35511,
     "title": "RFC: consensus: Make `CAmount` a class",
     "author": "hodlinator"
    },
    {
     "number": 35377,
     "title": "wallet: Allow importing of descriptors without private keys when the wallet has the private keys",
     "author": "achow101"
    },
    {
     "number": 34861,
     "title": "wallet: Add importdescriptors interface",
     "author": "polespinasa"
    },
    {
     "number": 34681,
     "title": "wallet: move rescan logic into ChainScanner and wallet/scan",
     "author": "Eunovo"
    }
   ]
  }
 },
 "acks_parsed": {
  "murchandamus": {
   "kind": "ack",
   "hash": null,
   "t": "2025-01-23T20:19:04Z",
   "stale": true
  },
  "josibake": {
   "kind": "ack",
   "hash": null,
   "t": "2024-02-28T12:57:56Z",
   "stale": true
  },
  "achow101": {
   "kind": "ack",
   "hash": "85ebfc485bd46f061b19902dc4ccb2dbf58bd5fe",
   "t": "2026-02-05T23:49:41Z",
   "stale": true
  },
  "polespinasa": {
   "kind": "ack",
   "hash": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "t": "2026-09-15T17:22:57Z",
   "stale": false
  }
 },
 "acks_tally": {
  "ack": 1,
  "stale_ack": 3,
  "concept_ack": 0,
  "approach_ack": 0,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 1,
  "changes_requested": 0,
  "distinct_reviewers": [
   "achow101",
   "furszy",
   "glozow",
   "jonatack",
   "josibake",
   "luke-jr",
   "maflcko",
   "murchandamus",
   "polespinasa",
   "sedited",
   "yancyribbens"
  ]
 },
 "signals": {
  "needs_rebase": false,
  "ci_failed": false,
  "mergeable_state": "clean",
  "last_author_activity": "2026-09-15T12:12:17Z",
  "last_reviewer_activity": "2026-09-15T17:22:57Z",
  "last_reviewer": "polespinasa",
  "author_silent_days": 2,
  "waiting_on_author_days": 1,
  "days_since_update": 1
 },
 "refs": {
  "mentioned": [
   29220,
   29661,
   32138,
   32636
  ],
  "depends_on": [],
  "fixes": [
   29220
  ],
  "linked_issues": [
   {
    "number": 29220,
    "type": "issue",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "`-maxtxfee` is used as a fee and a feerate"
   }
  ],
  "references": [
   {
    "number": 29220,
    "type": "issue",
    "state": "open",
    "merged": false,
    "merged_at": null,
    "title": "`-maxtxfee` is used as a fee and a feerate"
   },
   {
    "number": 29661,
    "type": "issue",
    "state": "closed",
    "merged": false,
    "merged_at": null,
    "title": "100,000\u202f\u1e69/vB is excessive as a sanity check on feerate"
   },
   {
    "number": 32138,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-02-19",
    "title": "wallet, rpc: remove settxfee and paytxfee"
   },
   {
    "number": 32636,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-02-04",
    "title": "Split `CWallet::Create()` into `CreateNew` and `LoadExisting`"
   }
  ],
  "conflicts": [
   35752,
   35713,
   35511,
   35377,
   34861,
   34681
  ]
 },
 "stack": {
  "shares_commits_with": [],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [
  "doc/release-notes-29278.md",
  "src/common/messages.cpp",
  "src/dummywallet.cpp",
  "src/init.cpp",
  "src/interfaces/chain.h",
  "src/node/interfaces.cpp",
  "src/node/transaction.cpp",
  "src/node/transaction.h",
  "src/qt/psbtoperationsdialog.cpp",
  "src/qt/walletmodel.cpp",
  "src/rpc/mempool.cpp",
  "src/util/error.cpp",
  "src/wallet/feebumper.cpp",
  "src/wallet/init.cpp",
  "src/wallet/interfaces.cpp",
  "src/wallet/rpc/spend.cpp",
  "src/wallet/spend.cpp",
  "src/wallet/test/wallet_tests.cpp",
  "src/wallet/wallet.cpp",
  "src/wallet/wallet.h",
  "test/functional/rpc_psbt.py",
  "test/functional/rpc_rawtransaction.py",
  "test/functional/wallet_bumpfee.py",
  "test/functional/wallet_send.py"
 ],
 "body": "This PR fixes #29220\n\n- The PR adds a wallet `-maxfeerate` startup option, as the upper limit of wallet transactions fee rate.\n\n- This fixes the ambiguity of using `maxtxfee` value to check the upper limit of transactions fee rate.\n\n-  Wallet will not create a transaction with fee rate above `maxfeerate` value.\n\n- This PR adds a functional test that ensure the behavior is enforced.",
 "commits": [
  {
   "sha": "a9c39696f4be2ffe02cd78d152f4e5960692c833",
   "date": "2026-09-15T09:56:28Z",
   "message": "scripted-diff: rename `m_default_max_tx_fee` to `m_max_tx_fee`\n\n-BEGIN VERIFY SCRIPT-\ngit grep -l \"m_default_max_tx_fee\" src | xargs sed -i \"s/m_default_max_tx_fee/m_max_tx_fee/g\"\ngit grep -l \"getDefaultMaxTxFee\" src | xargs sed -i \"s/getDefaultMaxTxFee/getMaxTxFee/g\"\n-END VERIFY SCRIPT-\n\n- The value is not always the default but can be configured\n  during startup so `m_max_tx_fee` is the right name not\n  `m_default_max_tx_fee`."
  },
  {
   "sha": "6b913b6224bdafac6b83328441a347a00d7d4d06",
   "date": "2026-09-15T09:56:30Z",
   "message": "doc: add missing verb to make sentence readable"
  },
  {
   "sha": "607568f2b00260ac54fd4c2c904002be17edebfd",
   "date": "2026-09-15T09:56:31Z",
   "message": "[wallet]: update `max_fee` to `max_tx_fee`\n\n- Also update `-maxapsfee` option from `max_fee` to `max_aps_fee`.\n  This fixes the ambiguity in the variable name.\n\nThe comment on m_max_tx_fee described it as the value used \"by default\"\nfor the wallet, but it is not always the default: it can be overridden\nvia -maxtxfee. Drop \"by default\" to avoid the misleading wording."
  },
  {
   "sha": "7bfce65801bf5a7ae45f5f75a627e6cd03d9c8c0",
   "date": "2026-09-15T09:56:31Z",
   "message": "[wallet]: add `maxfeerate` wallet startup option\n\n- The commits adds a new wallet startup option `-maxfeerate`\n\n- The value will be used as the upper limit of wallet transaction fee rate.\n\n- The commit updates all instances where `-maxtxfee` value is utilized to check\n  wallet transactions fee rate upper limit to now use `-maxfeerate` value."
  },
  {
   "sha": "633c08d3f7af95953a818c645a4ad4c90f0bbdb0",
   "date": "2026-09-15T10:19:19Z",
   "message": "[node]: update `BroadcastTransaction` to check fee rate limit\n\n`BroadcastTransaction` now accepts a fee rate limit as an additional input\nparameter. It rejects transactions whose fee exceeds the maximum fee amount\npermitted by that fee rate for the transaction vsize.\n\nCompare against `maxfeerate.GetFee(vsize)` instead of reconstructing a fee\nrate from the accepted fee. This preserves the existing rounded fee cap\nsemantics used by `testmempoolaccept` and avoids rejecting transactions whose\nrounded fee is still within the configured limit.\n\nThis allows callers to distinguish between failures caused by the absolute fee\nlimit (`-maxtxfee`) and the fee rate limit (`maxfeerate` or `-maxfeerate`).\n\n`TestSimpleSpend` creates transactions paying `DEFAULT_TRANSACTION_MAXFEE`.\nSince `BroadcastTransaction` now also checks the fee rate limit, these small\nhigh-fee transactions would exceed `DEFAULT_MAX_TRANSACTION_FEERATE`. Update\nthe test broadcast limit to be slightly above the transaction fee rate.\n\nIn `wallet_fundrawtransaction.py`'s `test_22670` subtest, restart node 0 with\n`-maxfeerate` above `-minrelaytxfee` so high-feerate transactions can be\nbroadcast."
  },
  {
   "sha": "d2c832e9e79d0f8691e64f25bcfe198ae34805d5",
   "date": "2026-09-15T11:26:39Z",
   "message": "[util]: add a new transaction error type\n\n- This distinguishes maxfeerate and maxtxfee error messages."
  },
  {
   "sha": "df1feeb487dc54dc44ac8eff96650319bb3a2584",
   "date": "2026-09-15T11:26:40Z",
   "message": "[wallet]: enforce `-maxfeerate` on wallet transactions\n\nThis commit prevents the wallet from submitting or broadcasting transactions\nabove `-maxfeerate`, and tests the new functionality.\n\nCompare wallet transaction fees against `maxfeerate.GetFee(vsize)` instead of\nreconstructing a fee rate from the rounded fee. This allows transactions whose\nrequested fee rate is at the configured limit, even when the resulting fee is\nrounded up to whole satoshis.\n\n`rpc_psbt.py` functional test nodes are modified to start with a custom\n`-maxfeerate=1`, because the test requires creating and broadcasting a\ntransaction with a high fee rate.\n\nA node in some subtests in `wallet_fundrawtransaction.py` is restarted with\n`-maxfeerate=1` because those subtests require the node's wallet to be able to\ncreate and broadcast transactions with a high fee rate."
  },
  {
   "sha": "40ab7aa90de5a6382fe6f8946cde735e05308a20",
   "date": "2026-09-15T11:26:41Z",
   "message": "[wallet]: warn when `-maxtxfee` conflicts with `-minrelaytxfee`\n\n- Wallets cannot create transactions with fee rates below\n  `-minrelaytxfee`, and they also reject transactions whose total fee\n  exceeds `-maxtxfee`.\n\n- Warn when a 1 kvB transaction paying exactly `-maxtxfee` would still\n  have a fee rate below `-minrelaytxfee`. In this configuration, some\n  transactions that meet the minimum relay fee rate may exceed\n  `-maxtxfee`, preventing the wallet from creating them.\n\n- Keep this warning independent from the existing high `-maxtxfee`\n  warning, so users see both warnings when both conditions apply."
  },
  {
   "sha": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "date": "2026-09-15T11:26:42Z",
   "message": "[doc]: add release notes"
  }
 ],
 "timeline": [
  {
   "t": "2024-01-19T14:39:21Z",
   "kind": "review_comment",
   "who": "glozow",
   "assoc": "CONTRIBUTOR",
   "path": "src/init.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "I think you accidentally put the `maxburnamount` helptext in the `incrementalrelayfee` helptext here?"
  },
  {
   "t": "2024-01-19T14:44:29Z",
   "kind": "review_comment",
   "who": "glozow",
   "assoc": "CONTRIBUTOR",
   "path": "src/rpc/mempool.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "Why delete these options (suddenly removing support for something that users might rely on)? Even if a config exists, I can imagine somebody wanting to change the maximum for a single RPC call without needing to restart their node."
  },
  {
   "t": "2024-01-19T14:51:40Z",
   "kind": "review_comment",
   "who": "glozow",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/wallet.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "Why not just make this a `CFeeRate`? Or describe this as satoshis per KvB. \"fee rate (in satoshis)\" doesn't really make sense to me."
  },
  {
   "t": "2024-01-19T14:58:03Z",
   "kind": "review_comment",
   "who": "glozow",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/wallet.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1459145558,
   "text": "I also don't see this value being used anywhere other than `settxfee`?\n\n[quoted text omitted]\nShouldn't there be a check in `CreateTransactionInternal` that makes sure we don't make transactions above this feerate, and an arg passed to `BroadcastTransaction`? I also don't see a test case for it."
  },
  {
   "t": "2024-01-19T15:05:34Z",
   "kind": "review",
   "who": "glozow",
   "assoc": "CONTRIBUTOR",
   "state": "COMMENTED",
   "commit": "2576efcf689401dcbea85856c74efc64af0c2cb2",
   "text": "I mentioned adding a `maxfeerate` option in #29220, but I was more imagining it as a wallet-only option. I don't think that wallet configurations should bleed into how the node RPCs function. Instead, the interaction there should be for wallet to pass it as a param to `BroadcastTransaction` when the it submits a tx to the node.\n\nI'm also not sure about `maxburnamount` being a node-wide config (https://github.com/bitcoin/bitcoin/issues/29217#issuecomment-1900585661)"
  },
  {
   "t": "2024-01-19T16:12:17Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Thanks @glozow for your review.\nWill put this PR in draft while addressing Approach feedback"
  },
  {
   "t": "2024-01-23T04:28:54Z",
   "kind": "comment",
   "who": "luke-jr",
   "assoc": "CONTRIBUTOR",
   "text": "I agree this feels more like it should be a wallet option."
  },
  {
   "t": "2024-01-25T21:29:45Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "b9f2ddc0b1e42c2fdca68c7db5cd241ed3214e62"
  },
  {
   "t": "2024-01-25T21:53:11Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "0c9e0c5b2218c154b62275794b878af7e1457647"
  },
  {
   "t": "2024-01-25T22:06:13Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/init.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1459122123,
   "text": "This is gone now."
  },
  {
   "t": "2024-01-25T22:06:43Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/rpc/mempool.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1459131869,
   "text": "Reverted thank you."
  },
  {
   "t": "2024-01-25T22:07:55Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1459145558,
   "text": "Done, `CFeeRate` is the right format since we are representing fee rate."
  },
  {
   "t": "2024-01-25T22:11:52Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1459145558,
   "text": "[quoted text omitted]\n\nAgreed\n\nI Added a check in `CreateTransactionInternal` in 0c9e0c5b2218c154b62275794b878af7e1457647.\n\nNo need to pass an arg to `BroadcastTransaction`,  if the transaction fee rate is above `maxfeerate` it will not reach `BroadcastTransaction`.\n\n[quoted text omitted]\nI added a test in 0c9e0c5b2218c154b62275794b878af7e1457647."
  },
  {
   "t": "2024-01-25T22:19:38Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Forced pushed from https://github.com/bitcoin/bitcoin/commit/2576efcf689401dcbea85856c74efc64af0c2cb2 to https://github.com/bitcoin/bitcoin/commit/0c9e0c5b2218c154b62275794b878af7e1457647 Compare the [diff](https://github.com/bitcoin/bitcoin/compare/2576efcf689401dcbea85856c74efc64af0c2cb2..0c9e0c5b2218c154b62275794b878af7e1457647)\n- All review comments are addressed\n- Removed `maxburnamount` option\n- Made `maxfeerate` wallet option\n- Added a check in `CreateTransactionInternal` that makes sure we don't make transactions above this `-maxfeerate`.\n- Fixed ambiguity between `-maxtxfee` and `maxfeerate`\n- Prevent setting wallet feerate above `maxfeerate` from `settxfee` RPC\n- Added a functional test case\n- Updated PR OP"
  },
  {
   "t": "2024-01-27T17:01:54Z",
   "kind": "review_comment",
   "who": "luke-jr",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/init.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "This still isn't a wallet option..."
  },
  {
   "t": "2024-01-29T09:21:15Z",
   "kind": "review_comment",
   "who": "glozow",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_send.py",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": null,
   "text": "Maybe add tests where you (successfully) configure the node's wallet using `-maxfeerate`?"
  },
  {
   "t": "2024-01-29T09:23:07Z",
   "kind": "review_comment",
   "who": "glozow",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_send.py",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 1469291356,
   "text": "Similarly, it would be good to test that both maxfee and maxfeerate requirements must be met."
  },
  {
   "t": "2024-01-29T09:25:41Z",
   "kind": "review_comment",
   "who": "glozow",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/wallet.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "1000 is redundant"
  },
  {
   "t": "2024-01-29T10:15:17Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/spend.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "I think we should keep the word \"wallet\" here, since this is a client set option. If you look at the RPC call above, it differentiates between the node wide policy of `relayMinFee` and the wallet set policy `m_min_fee` by adding the world \"wallet\" to the RPC error."
  },
  {
   "t": "2024-01-29T10:18:09Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": null,
   "text": "I don't think we should remove this check for setting a `max_fee` that results in fee rates less than the `relayMinFee`."
  },
  {
   "t": "2024-01-29T10:40:28Z",
   "kind": "review",
   "who": "josibake",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "0c9e0c5b2218c154b62275794b878af7e1457647",
   "text": "It seems odd to me that we would ever have `maxtxfee` and `maxfeerate` set together as they seem to cover entirely different scenarios.\n\nFor `maxtxfee`, a user is expressing \"I don't or care what my transaction size is but I know I never want to spend more than X in total fees.\"\n\nFor `maxfeerate` as user is expressing \"I know that my transactions will vary a lot in size, so I don't know what the total fees will be, but I do know that I don't want to pay more than X sats/per vbyte.\"\n\nI am struggling to think of a scenario where it makes sense to combine them. On the other hand, if I set a `maxtxfee` of Y and a `maxfeerate` of X, there input sets that are valid for Y but not valid for X and also inputs that are valid for X but not for Y.\n\nWhat do you think about only letting the user set one or the other? Or is there a use case for caring about the total fees you pay AND caring about the sats per vbyte you pay that I'm not understanding?"
  },
  {
   "t": "2024-01-29T12:25:55Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/init.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1468533274,
   "text": "I dont understand why you said it is not a wallet option.\nThe `OptionsCategory` of this startup option is `WALLET`.\nAnd its only used in the wallet.\n\nCan you please expand on your comment.\nThanks"
  },
  {
   "t": "2024-01-29T17:59:49Z",
   "kind": "comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nI think it makes sense to have both. I could have a `maxtxfee` of the upper bound of what I'm willing to pay ever, and also set `maxfeerate` to something reasonable just to make sure I don't typo a feerate and accidentally pay a feerate orders of magnitude higher than intended. At `maxfeerate`, a small transaction can still pay a smaller fee than `maxtxfee`, but a large transaction could exceed `maxtxfee`."
  },
  {
   "t": "2024-01-29T18:37:46Z",
   "kind": "comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nBut in this example, if you typo'd a feerate orders of magnitude higher, your `maxtxfee` should get hit. If you accidentally typo a higher fee rate than intended but it's below the `maxtxfee` you're willing to pay, that doesn't seem like a big problem to me.\n\nSeems less footgunny to only let the user set one or the other (and then as a belt and suspenders still check the defaults for both, regardless of what is set?). But I might be overthinking this.. just seems really gross to have to now consider both of these in coin selection, especially if a user sets wonky values."
  },
  {
   "t": "2024-01-29T21:12:27Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Thank you for your comments @josibake @glozow @achow101 , will address review comments shortly.\n\n[quoted text omitted]\nI don't think this is true; it depends on what your `maxtxfee` is. Going by the default value of 0.10 BTC.\n\nThis is not likely to occur.\n\nI did a manual test on master.\n\nWhen I set `maxtxfee` to 0.10 BTC on master, if you mistakenly type 10,000 as the fee rate, the max fee exceed error will not be hit.\n\nHowever, in some cases where you set a low `maxtxfee`it may be hit or not depending on the transaction size.\nIt's uncertain.\n\n```terminal\nabubakarismail@Abubakars-MacBook-Pro bitcoin % ./src/bitcoind -regtest -maxtxfee=0.10  -daemon\nBitcoin Core starting\n\nabubakarismail@Abubakars-MacBook-Pro bitcoin % ./src/bitcoin-cli -regtest loadwallet abubakar-test\n{\n  \"name\": \"abubakar-test\"\n}\n\nabubakarismail@Abubakars-MacBook-Pro bitcoin % ./src/bitcoin-cli -regtest -named sendtoaddress address=\"bcrt1qt3fvqww6reduq287nhl59cu05hmyrj7achar44\" fee_rate=10000 amount=1\n22a92fdfa68581ba1d3da4aeedaeb20c7570b8c8eff9c29699c846aa1dacd73d\n\n```\n\n---\n\nOn this branch, if I set my `-maxtxfee` as 0.10 absolute fee and `-maxfeerate` as (0.010 which is 1000s/vb), and make a typo in a `sendtoaddress` call with a `fee_rate` of 10,000 s/vb instead of 100, the `maxfeerate` check will be hit.\n```\n ./src/bitcoind -regtest -maxfeerate=0.01 -maxtxfee=0.10 -daemon\nBitcoin Core starting\nabubakarismail@Abubakars-MacBook-Pro bitcoin % ./src/bitcoin-cli -regtest loadwallet abubakar-test\n{\n  \"name\": \"abubakar-test\"\n}\n\nabubakarismail@Abubakars-MacBook-Pro bitcoin % ./src/bitcoin-cli -regtest -named sendtoaddress address=\"bcrt1qt3fvqww6reduq287nhl59cu05hmyrj7achar44\" fee_rate=10000 amount=1\nerror code: -6\nerror message:\nFee exceeds maximum configured by user (e.g. -maxtxfee, maxfeerate)\n```\n\nIIUC `-maxtxfee` should generally be high as the maximum absolute fee you think you can ever pay, and `-maxfeerate` as a cautionary check against an absurd fee rate for a transaction based on current fee estimates.\n\nMaybe I should differentiate between the two error messages and make it more verbose, so that users can know which one is hit and adjust if its not intentional."
  },
  {
   "t": "2024-01-29T21:14:20Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nI dont really understand how this can affect coinselection, can you expand please? Thanks"
  },
  {
   "t": "2024-01-30T09:26:53Z",
   "kind": "comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nSorry, I was completely overthinking it! I was incorrectly thinking that we took `max_tx_fee` and `tx_fee_rate` as inputs to coin selection, but what we do instead:\n\n1. Check the if the user provided a `fee_rate` (this fee rate would have already been sanity checked against `max_fee_rate`)\n2. If not, get a fee rate by doing some checks against min fees and fee estimation\n3. Check `max_tx_fee` *after* the transaction is done (and now `max_tx_fee_rate`)"
  },
  {
   "t": "2024-01-30T09:44:12Z",
   "kind": "comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "text": "@ismaelsadeeq thanks for walking through the scenario! Reading over what you posted, if `maxtxfee` is left as the default, then the user can set whatever they want for `maxfeerate` without any issues. Depending on the types of transactions they make, they are essentially setting a new, lower `maxtxfee`.\n\nIf the user is setting both, they could create weird scenarios where the `maxtxfee` is too low compared to the `maxtxfeerate` and vice versa. But thinking it through and with your examples, I think most of my concern boils down to \"the user set a `maxtxfee` which is too low for the current fee environment.\"\n\n[quoted text omitted]\nI think differentiating errors makes sense! Then it doesn't really matter if the user sets bad values for `max_fee_rate` or `max_tx_fee`, so long as we tell them which bad value is getting hit and prompt them to change it."
  },
  {
   "t": "2024-01-30T09:46:44Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/spend.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "perhaps introduce a new error type:\n\n```suggestion\n        return util::Error{TransactionErrorString(TransactionError::MAX_FEE_RATE_EXCEEDED)};\n```"
  },
  {
   "t": "2024-01-30T10:28:15Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1459145558,
   "text": "Interestingly, in https://github.com/bitcoin/bitcoin/blob/411ba32af21a56efa0a570b6aa8bf8f035410230/src/rpc/mempool.cpp#L89\n\n`sendrawtransaction` takes a fee_rate argument, which is used to calculate a `max_tx_fee` based on the size of the transaction, and this `max_tx_fee` is passed to `BroadcastTransaction`. This means a user could typo an insane `maxfeerate` when calling `sendrawtransaction` that bypasses the default max tx fee.\n\nPerhaps it does make more sense to have `BroadcastTransaction` take two arguments, one for `max_tx_fee` and another for `max_tx_fee_rate`, and check them independently. Probably out of scope for this PR, since this is focused on the wallet, but wanted to mention it as a potential follow-up."
  },
  {
   "t": "2024-01-31T12:40:13Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "d4dceeafc2292cd050cb10e308d73bc8ef84201a"
  },
  {
   "t": "2024-01-31T12:40:38Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/spend.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1470885445,
   "text": "Added"
  },
  {
   "t": "2024-01-31T12:41:29Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1469296961,
   "text": "Yes, fixed here and other place I did the same."
  },
  {
   "t": "2024-01-31T12:47:44Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_send.py",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 1469291356,
   "text": "[quoted text omitted]\n\nI dont understand what you mean by successfully configure nodes wallet.\n\nThe test you are commenting on configure node[0] with the `-maxfeerate` option.\nCould you clarify your comment, thanks.\n\n---\n[quoted text omitted]\n\nTheir is a test for `maxtxfee` already, and I added one for `maxfeerate`.\nhttps://github.com/bitcoin/bitcoin/blob/11b436a66af3ceaebb0f907878715f331516a0bc/test/functional/wallet_bumpfee.py#L557"
  },
  {
   "t": "2024-01-31T12:56:08Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 1469372132,
   "text": "`relayMinFee` is relative to the fee rate of the transaction. I believe I did the right thing by removing it and enforcing this check on `-maxfeerate` instead.\n\nI don't think we should use the base fee value as a quantifier for the fee rate, as transaction sizes differ.\nThis is indicated in the issue description #29220."
  },
  {
   "t": "2024-01-31T13:01:06Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1459145558,
   "text": "Thanks for highlighting this issue @josibake , I agree with your `BroadcastTransaction` should enforce check on both.\nThis will make `sendrawtransaction` returns a specific error message.\n\n---\nFor this reason\n`MAX_FEE_RATE_EXCEEDED` error string is now `Fee exceeds maximum configured by user.`\nbecause if I add the option `maxtxfee` it will be misleading in `sendrawtransaction` output"
  },
  {
   "t": "2024-01-31T13:18:31Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 1469372132,
   "text": "I think the check needs to be enforced on both, since we are letting a user set one or the other (or both). Removing the check entirely for one of the options feels like a regression.\n\nIt's a good point that using the base fee value as a quantifier is not ideal, but previously this code was checking that the user did not set a `maxtxfee` that was so low that the minrelay fee could never be met. Now you've removed that check, which means I can set a very low `maxtxfee` and not get a warning."
  },
  {
   "t": "2024-01-31T13:22:00Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/util/error.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "Better to keep the option name in the error message:\n\n```suggestion\n            return Untranslated(\"Fee exceeds maximum configured by user (maxtxfee)\");\n```"
  },
  {
   "t": "2024-01-31T13:25:53Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/util/error.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1472815229,
   "text": "Yes but I think should come in a follow-up after cleaning up your suggestion here\nhttps://github.com/bitcoin/bitcoin/pull/29278#discussion_r1472790897\n\nI have a local branch that does this on top of this branch."
  },
  {
   "t": "2024-01-31T13:55:50Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 1469372132,
   "text": "[quoted text omitted]\n\nI don't think its a regression because this is the right behavior to check if the maximum fee rate we set is < minimum relay fee rate.\n\n[quoted text omitted]\nWith the assumption of 1k vb size, transactions can have more or less virtual size though.\n\nI think we prevent creating transactions with fee rate below `relayMinFee` , so I think this okay?"
  },
  {
   "t": "2024-01-31T14:57:44Z",
   "kind": "review_comment",
   "who": "glozow",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/wallet.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 1469372132,
   "text": "[quoted text omitted]\n\nPerhaps just retain a version of the old check by enforcing that `maxtxfee` is set to at least `CAmount FLOOR_MAXTXFEE{1000}` (a conversion from the default min relay feerate)?"
  },
  {
   "t": "2024-01-31T17:50:24Z",
   "kind": "comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "text": "Concept ACK\n\nMy scenario for using both `maxtxfee` and `maxfeerate` would be slightly different. For example looking at the mempool in January, I might generally be okay with paying up to 50\u202fsat/vB, but not a higher feerate, because I expect that it will generally suffice to get a confirmation within 24h, but at such a high feerate, I would not want to make a transaction with more than 10\u202finputs. So, I\u2019d delimit the feerate itself on the one hand, and then also limit the `maxtxfee` to 35'000 sats which is enough for a transaction with 10\u202fP2TR keypath inputs and two P2TR outputs at 50\u202fsat/vB. Through this general limit on the cost of a single transaction I could essentially set an upper bound on the total input weight of my transactions which would increase with lower feerates."
  },
  {
   "t": "2024-01-31T17:52:21Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/spend.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "We are comparing two feerates, should this perhaps be:\n\n```suggestion\n        throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf(\"fee rate cannot be more than wallet max tx fee rate (%s)\", pwallet->m_max_tx_fee_rate.ToString()));\n```"
  },
  {
   "t": "2024-01-31T17:56:19Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In 7664ec9bd744ab5ae403a87cd9d2aa3de747d278 (wallet: add `maxfeerate` wallet startup option):\n\n `walletInstance->m_default_max_tx_fee` indicates to me that the value is the _default_ if the user does not customize the value, so it is confusing to me that the user value is assigned to a variable with \"default\" in its name.\n\n```suggestion\n        walletInstance->m_max_tx_fee = max_fee.value();\n```"
  },
  {
   "t": "2024-01-31T18:02:51Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In 7664ec9bd744ab5ae403a87cd9d2aa3de747d278 (wallet: add `maxfeerate` wallet startup option):\n\nIf I did not miscalculate this feerate translates to 10'000\u202fsat/vB. A single input two output P2TR transaction would incur a cost of over 15\u202fm\u20bf at that feerate. I could see how this might be reached if we CPFP a big transaction with a small transaction, but for a standalone transaction this limit fees too high for a failsafe."
  },
  {
   "t": "2024-01-31T18:07:41Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/feebumper.cpp",
   "commit": "394e29b3a508a4bf725df40675f54a80760e0d7a",
   "in_reply_to": null,
   "text": "In a4b93767df8ce3f2b688b5295066965f4854f40f (wallet: test: enforce -maxfeerate on wallet transactions):\n\nGiven that we might use a small transaction to bump a big transaction, we might actually want to have a very large feerate on the child to achieve a reasonable mining score for the parent-child package. Would it perhaps make sense to generally lower the default maxfeerate but then compare it with the resulting mining score instead of the new transaction\u2019s individual feerate?"
  },
  {
   "t": "2024-01-31T18:09:35Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/spend.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1470885445,
   "text": "In a4b93767df8ce3f2b688b5295066965f4854f40f (wallet: test: enforce -maxfeerate on wallet transactions):\n\nI am a bit confused. You marked this as resolved and said you added this, but I don\u2019t see it in the current version. Did you fix it in your working branch but haven\u2019t pushed yet?"
  },
  {
   "t": "2024-01-31T18:14:39Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_send.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In a4b93767df8ce3f2b688b5295066965f4854f40f (wallet: test: enforce -maxfeerate on wallet transactions):\n\nIf you first build a transaction that succeeds and then try to build a transaction that fails, this could also be caused by the success of the first transaction. Perhaps it would be better to turn around the order:\n\n1. Try to send at a feerate _above_ the `maxfeerate`, since that fails the wallet is still in the same state.\n2. Try to send at a feerate _just below_ the `maxfeerate` and show that it succeeds.\n\nPerhaps use 9900\u202fsat/vB instead of 1000\u202fsat/vB to box the `maxfeerate` a bit tighter."
  },
  {
   "t": "2024-01-31T18:14:47Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 1469372132,
   "text": "Summarizing my thoughts from some offline discussion with @ismaelsadeeq :\n\n* I'm fairly certain we don't check `relayMinFee` when creating a transaction, but it would be good to confirm this (even better, to have a functional test!)\n* If the user can set both `relayMinFee` and `maxtxfee`, I think we need to have a sanity check at startup to make sure they are not setting insane values that could result in them creating stuck transactions\n* I think its okay to use a \"fake transaction size\" for a sanity check, but we should probably call it that i.e. `BASELINE_TX_SIZE = <1000, or maybe a minimum tx size?>`. That way, it is used consistently throughout the codebase, has a comment explaining what it used for and what it shouldn't be used for, etc\n* There are a few other places where we use `maxtxfee` to calculate a fake feerate (such as `settxfee`). We should change those to use `maxtxfeerate`\n\nIn general, I agree we should always use `maxtxfeerate` when checking things about feerates. The only exception is during startup where we need to compare `maxtxfee` to other user set values relating to feerates."
  },
  {
   "t": "2024-01-31T18:16:27Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_send.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In a4b93767df8ce3f2b688b5295066965f4854f40f (wallet: test: enforce -maxfeerate on wallet transactions):\n\nOne transaction but closer to the limit should suffice:\n\n```suggestion\n        self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), amount=1, fee_rate=9)\n```"
  },
  {
   "t": "2024-01-31T18:20:12Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/util/error.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1472815229,
   "text": "In d4dceeafc2292cd050cb10e308d73bc8ef84201a (wallet: test: add new transaction error type):\n\nIt isn\u2019t clear to me why we would first ship a less descriptive new error message in this PR and then immediately fix it in a follow-up. It seems better to ship a descriptive error message right here."
  },
  {
   "t": "2024-01-31T18:21:14Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_psbt.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In d4dceeafc2292cd050cb10e308d73bc8ef84201a (wallet: test: add new transaction error type):\n\nThis seems strictly less informative. I would second @josibake in the suggestion to keep mentioning the `maxtxfee` here. Maybe I\u2019m missing something, could you elaborate why you would push that back to a follow-up?"
  },
  {
   "t": "2024-01-31T18:21:39Z",
   "kind": "review",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "d4dceeafc2292cd050cb10e308d73bc8ef84201a",
   "text": "Concept ACK"
  },
  {
   "t": "2024-01-31T18:24:19Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/spend.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1470885445,
   "text": "I realized now that you are adding the new Error type in the third commit. It would make more sense to me if the new Error type were introduced first, and then the test that uses it would get added rather than adding the test and then later introducing the new Error type."
  },
  {
   "t": "2024-01-31T18:27:19Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 1469372132,
   "text": "[quoted text omitted]\n\nThis doesn't cover the case where a user sets a `maxtxfee` and a custom `relayMinFee`. Admittedly, the old check wasn't perfect in that the user could still create > 1000 vbyte transactions that *might* still cause a problem. I think the best would be have a sanity check at startup (either the old one, or a new one with a different default for baseline tx size) and ALSO check that we are respecting the `relayMinFee` during transaction construction"
  },
  {
   "t": "2024-01-31T18:30:47Z",
   "kind": "comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "text": "Concept ACK"
  },
  {
   "t": "2024-02-02T17:19:28Z",
   "kind": "review_comment",
   "who": "jonatack",
   "assoc": "MEMBER",
   "path": "src/dummywallet.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": null,
   "text": "Adding a new configuration option would need a release note."
  },
  {
   "t": "2024-02-05T07:36:04Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "3080c00e68440d0bde604a87b8f8e3fb3fa31ee8"
  },
  {
   "t": "2024-02-05T07:38:09Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "4358cb0b67dedf346185cfd8e49ad818b5fed722"
  },
  {
   "t": "2024-02-05T07:42:28Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "f5b21e8f1d5ef096a9c186ec6f881b42ade9c684"
  },
  {
   "t": "2024-02-05T08:02:11Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 1469372132,
   "text": "[quoted text omitted]\n\nI've tested this, and it turns out that the wallet indeed prevents creating transactions below the `minrelaytxfee`\n https://github.com/bitcoin/bitcoin/blob/a11585692e72cac468fb1496ea2c30e4c07f73e5/src/wallet/spend.cpp#L1055\n\nHere is a test that confirms we can't create transactions with a fee rate below the minimum relay fee, and also the node won't start if maxtxfee is very low so that a 1000 VB transaction with `maxtxfee` base fee fee rate is below`minrelaytxfee`.\nSee https://github.com/ismaelsadeeq/bitcoin/commit/aa075b8ef0b43f03d2fbef41c04a71403e93d904\n\nIn cases where users set a high `minrelaytxfee` and low `maxtxfee`, they can't even create transactions.\nI agree with @josibake suggestion and added a commit that performs the same check in wallet initialization as before.\nnode won't start if `maxtxfee` is very low so that a 1000 vb transaction with `maxtxfee` base fee fee rate is below the `minrelaytxfee`.\n\nIn cases where the transaction size exceeds 1000 vb, the wallet check should safeguard against creating stuck transactions."
  },
  {
   "t": "2024-02-05T08:04:33Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/spend.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1470885445,
   "text": "Thanks @murchandamus, I agree with your suggestion and reorder the commits."
  },
  {
   "t": "2024-02-05T08:23:11Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/util/error.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1472815229,
   "text": "The reason is that the maximum fee rate check for [`sendrawtransaction`](https://github.com/bitcoin/bitcoin/blob/a11585692e72cac468fb1496ea2c30e4c07f73e5/src/rpc/mempool.cpp#L84-L94) is performed in `BroadcastTransaction` which returned [`MAX_FEE_EXCEEDED`](https://github.com/bitcoin/bitcoin/blob/a11585692e72cac468fb1496ea2c30e4c07f73e5/src/node/transaction.cpp#L71-L79) error type to `sendrawtransaction`.\nIf I change the `MAX_FEE_EXCEEDED` error message to \"Fee exceeds maximum configured by user (maxtxfee)\" without changing how it's checked, this would be misleading for `sendrawtransaction` callers and I wanted this to be a minimal wallet change that adds the `maxfeerate` option to the wallet.\n\nHowever I agree with your comment, I have now added a commit that also checks the fee rate limit in `BroadcastTransaction`,  and changed how `sendrawtransaction` is implemented, and updated the `MAX_FEE_EXCEEDED` transaction error type message."
  },
  {
   "t": "2024-02-05T08:30:21Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "d1eabac320a09a18cd50d2c08624220f3f92fd4e"
  },
  {
   "t": "2024-02-05T08:30:49Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/spend.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1473230950,
   "text": "Fixed, thanks"
  },
  {
   "t": "2024-02-05T08:31:44Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1473237266,
   "text": "fixed"
  },
  {
   "t": "2024-02-05T08:34:38Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_send.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1473269857,
   "text": "I've implemented your suggestion \ud83d\udc4d\ud83c\udffe"
  },
  {
   "t": "2024-02-05T08:34:50Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_send.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1473271780,
   "text": "Fixed"
  },
  {
   "t": "2024-02-05T08:35:16Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/dummywallet.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 1476415646,
   "text": "Added thanks"
  },
  {
   "t": "2024-02-05T08:39:46Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1473247758,
   "text": "Yes its 10'000 sat/vb, I agree its high indeed Should I reduce it to maybe 1000 s/vb instead?\n\n---\nThis is configurable option can be reduced by users to threshold they want."
  },
  {
   "t": "2024-02-05T09:19:35Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "a5d10367cf832497af2ac72f8c2c42dd25398c63"
  },
  {
   "t": "2024-02-05T09:57:16Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/feebumper.cpp",
   "commit": "394e29b3a508a4bf725df40675f54a80760e0d7a",
   "in_reply_to": 1473256087,
   "text": "[quoted text omitted]\n\n\ud83e\udd14 Not sure how to implement the change you suggested honestly.\nThe current behavour is checking if target fee rate of user wants to bump the transaction to is greater than `maxfeerate` which I believe is the new mining score of the bumped transaction no?\nI might be wrong on my assumption though, would you clarify your comment on how to check the resulting mining score of a bumped transaction please? thanks."
  },
  {
   "t": "2024-02-06T11:48:52Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/rpc/mempool.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "in \"node: BroadcastTransaction should also check tx fee rate limit\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/30bf6674b117cb320984ac66133a496f19166160):\n\n```suggestion\n            const TransactionError err = BroadcastTransaction(node, tx, err_string, /*max_tx_fee=*/0, max_raw_tx_fee_rate, /*relay=*/true, /*wait_callback=*/true);\n```"
  },
  {
   "t": "2024-02-06T11:52:04Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/test/wallet_tests.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "in \"node: BroadcastTransaction should also check tx fee rate limit\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/30bf6674b117cb320984ac66133a496f19166160):\n\nDon't we have a `DEFAULT_TRANSACTION_MAXFEERATE`? Wouldn't it be better to use that here instead of 0?"
  },
  {
   "t": "2024-02-06T11:52:28Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/test/wallet_tests.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "in \"node: BroadcastTransaction should also check tx fee rate limit\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/30bf6674b117cb320984ac66133a496f19166160):\n\nSame comment as above regarding defaults"
  },
  {
   "t": "2024-02-06T11:53:09Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "in \"node: BroadcastTransaction should also check tx fee rate limit\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/30bf6674b117cb320984ac66133a496f19166160):\n\nSame comment regarding defaults vs 0"
  },
  {
   "t": "2024-02-06T12:01:50Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "in \"wallet: add maxfeerate wallet startup option\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/4165dc41289fd337e279f3986dfc1a84345c900e):\n\nInstead of touching this line twice, what do you think about reordering the commits so that this commit is first and the changes to `BroadcastTransaction` come after it? This way, you avoid needing to first set `/*max_tx_feerate=*/CFeeRate(0)` only to remove it in this commit."
  },
  {
   "t": "2024-02-06T12:08:26Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "9255efbe49a63155ced9facc3eeb42ed7c1bddc1",
   "in_reply_to": null,
   "text": "in \"wallet: add maxfeerate wallet startup option\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/4165dc41289fd337e279f3986dfc1a84345c900e):\n\nWhy are you removing the `-maxtxfee` test? Why not just add a new test case for `-maxfeerate`?"
  },
  {
   "t": "2024-02-06T12:18:54Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/feebumper.cpp",
   "commit": "394e29b3a508a4bf725df40675f54a80760e0d7a",
   "in_reply_to": 1473256087,
   "text": "What @murchandamus is suggesting makes a lot of sense for CPFP'ing, but I imagine will not be trivial to implement. What do you think about deferring this to a follow-up, @murchandamus ? That way, this PR can stay focused on only adding the option and with the current default for `maxtxfeerate` I don't think we will run into issues CPFP'ing with high feerate children.\n\nDefinitely agree though, comparing to the mining score would allow the user to set a lower limit to protect against high feerates on individual transactions, while also allowing high feerate children (potentially above the max limit) to be used to bump large parents."
  },
  {
   "t": "2024-02-06T12:20:26Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/spend.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "in \"wallet: test: enforce -maxfeerate on wallet transactions\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/eadc3a4500d6b7be263a2981602c20f6e5eb13a4):\n\nThis should be `MAX_FEE_RATE_EXCEEDED`, right?"
  },
  {
   "t": "2024-02-06T12:22:02Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "in \"wallet: test: enforce -maxfeerate on wallet transactions\" (https://github.com/bitcoin/bitcoin/commit/eadc3a4500d6b7be263a2981602c20f6e5eb13a4):\n\nWhat's the reason for changing the tests instead of adding a new test case for `maxfeerate`? Seems like we should be testing both rather than changing the old `maxtxfee` tests to now check `maxtxfeerate`."
  },
  {
   "t": "2024-02-06T12:25:44Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/qt/walletmodel.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": null,
   "text": "in \"wallet: rename m_default_max_tx_fee to m_max_tx_fee\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/a1497af6fc11009839ef86de1bf2da5cf99ad489):\n\nAgree that this is way less confusing as a name, but probably still good to have a commit message explaining your reasoning. I'd also suggest moving this commit to the beginning before any of the tests are changed and also add the refactor label to the commit message."
  },
  {
   "t": "2024-02-06T12:35:07Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "in \"wallet: ensure 1kvb tx with maxtxfee base fee has feerate atleast minrelaytxfee\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/9791ff064cf28df332c3c343c22eca6aa5874f39):\n\nJust a suggestion, but I think this reads a little bit better:\n```suggestion\n            error = strprintf(_(\"Invalid amount for %s=<amount>: '%s' conflicts with the minrelay fee of %s. Consider adjusting %s or %s.\"),\n```\n\nThis seems better to me since the reason for the error could be that the `minrelayfee` is set too high."
  },
  {
   "t": "2024-02-06T12:37:44Z",
   "kind": "review",
   "who": "josibake",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "a5d10367cf832497af2ac72f8c2c42dd25398c63",
   "text": "Looking good, and thanks for adding more tests!"
  },
  {
   "t": "2024-02-06T13:24:08Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1479660495,
   "text": "Yes \ud83d\udc4d\ud83c\udffe  its better that way."
  },
  {
   "t": "2024-02-06T13:31:23Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "9255efbe49a63155ced9facc3eeb42ed7c1bddc1",
   "in_reply_to": 1479669661,
   "text": "in \"wallet: add maxfeerate wallet startup option\" https://github.com/bitcoin/bitcoin/commit/4165dc41289fd337e279f3986dfc1a84345c900e\n\nAfter adding `maxfeerate` option we now only check if the fee rate user set is less  `minrelaytxfee`, less than wallet min fee, or whether it exceed `maxfeerate`.\nSo their is no need to check for `maxtxfee` here, because its not enforced here.\n\nWill add this info in commit message, thanks"
  },
  {
   "t": "2024-02-06T13:31:42Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/spend.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1479684395,
   "text": "Yes \ud83d\udc4d\ud83c\udffe"
  },
  {
   "t": "2024-02-06T13:40:22Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1479686164,
   "text": "Because after https://github.com/bitcoin/bitcoin/commit/eadc3a4500d6b7be263a2981602c20f6e5eb13a4 we now check for `maxfeerate` threshold first before checking `maxtxfee` threshold.\nAnd the specified fee rate is above default `maxferate`, as such it will be hit first.\n\nBut I agree, I will add another test where  specified bump fee rate is below the `maxfeerate` but we hit `maxtxfee` due to size or maybe just restart with `maxtxfee`  set to a lower value ?"
  },
  {
   "t": "2024-02-06T15:32:01Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1479686164,
   "text": "Either sounds fine! The main point is we shouldn't be removing test cases for maxtxfee while adding maxtxfeerate."
  },
  {
   "t": "2024-02-08T13:22:11Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "1fae882f98205afb05e96432ce57212226bc0909"
  },
  {
   "t": "2024-02-08T13:27:19Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/rpc/mempool.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1479646534,
   "text": "Fixed"
  },
  {
   "t": "2024-02-08T13:27:41Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/test/wallet_tests.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1479649957,
   "text": "Updated \ud83d\udc4d\ud83c\udffe"
  },
  {
   "t": "2024-02-08T13:29:27Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/spend.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1479684395,
   "text": "Fixed"
  },
  {
   "t": "2024-02-08T13:30:20Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1479686164,
   "text": "Thanks updated the tests."
  },
  {
   "t": "2024-02-08T13:30:54Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/qt/walletmodel.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 1479691126,
   "text": "Done"
  },
  {
   "t": "2024-02-08T13:31:05Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1479705580,
   "text": "Fixed"
  },
  {
   "t": "2024-02-08T13:34:51Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Thanks for your review @josibake\nI fixed all review comments\nForced pushed from a5d10367cf832497af2ac72f8c2c42dd25398c63 to 1fae882f98205afb05e96432ce57212226bc0909 [Compare changes](https://github.com/bitcoin/bitcoin/compare/a5d10367cf832497af2ac72f8c2c42dd25398c63..1fae882f98205afb05e96432ce57212226bc0909)"
  },
  {
   "t": "2024-02-12T12:54:25Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/node/transaction.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "in \"[node]: update BroadcastTransaction to check fee rate limit\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/eedbeccbdb274841fc2cf2c53931e58fbea50dfc):\n\nThis should be `MAX_FEERATE_EXCEEDED`"
  },
  {
   "t": "2024-02-12T13:00:04Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/node/transaction.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "in \"[node]: update BroadcastTransaction to check fee rate limit\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/eedbeccbdb274841fc2cf2c53931e58fbea50dfc):\n\nIf a `max_tx_fee` is set, and a `max_tx_feerate` is not set, `BroadcastTransaction` might hit the max_tx_fee limit, so its not quite correct to say that \"if CFeeRate(0), accept any fee.\" What about something like the following:\n\n```\n* @param[in]  max_tx_fee reject txs with fees higher than this (if 0, the fee is not checked)\n* @param[in]  max_tx_feerate reject txs with fee rate higher than this (if CFeeRate(0), the feerate is not checked)\n```"
  },
  {
   "t": "2024-02-12T13:02:37Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/rpc/mempool.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "in \"[node]: update BroadcastTransaction to check fee rate limit\" (https://github.com/bitcoin/bitcoin/commit/eedbeccbdb274841fc2cf2c53931e58fbea50dfc):\n\nnit:\n```suggestion\n            const TransactionError err = BroadcastTransaction(node, tx, err_string, /*max_tx_fee=*/0, max_raw_tx_fee_rate, /*relay=*/true, /*wait_callback=*/true);\n```"
  },
  {
   "t": "2024-02-12T13:15:20Z",
   "kind": "review",
   "who": "josibake",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "1fae882f98205afb05e96432ce57212226bc0909",
   "text": "Looking good! I think moving https://github.com/bitcoin/bitcoin/pull/29278/commits/d83ecdde0dfdbf46806be1310ad63716e33edc96 to be the 3rd commit (right after introducing the new option) makes more sense as there are still at least a few spots where you return a `MAX_TX_FEE` error incorrectly, and then fix it up in a later commit.\n\nAlso, small typo in https://github.com/bitcoin/bitcoin/pull/29278/commits/eedbeccbdb274841fc2cf2c53931e58fbea50dfc:\n\ns/differenciating/differentiating/"
  },
  {
   "t": "2024-02-12T14:44:03Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Thank you @josibake will address comments shortly!"
  },
  {
   "t": "2024-02-13T09:19:07Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "bf6fc126d1e0b37e490d38124945fa4e8f7475f4"
  },
  {
   "t": "2024-02-13T09:19:42Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/rpc/mempool.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1486152509,
   "text": "Fixed"
  },
  {
   "t": "2024-02-13T09:19:57Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/node/transaction.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1486149819,
   "text": "Thanks updated"
  },
  {
   "t": "2024-02-13T09:34:39Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/node/transaction.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1486143881,
   "text": "The `MAX_FEERATE_EXCEEDED` error type was not introduced yet at this point.\n This is correct because at https://github.com/bitcoin/bitcoin/commit/eedbeccbdb274841fc2cf2c53931e58fbea50dfc, the error message indicates that the failure might be from `-maxtxfee` or `maxfeerate`.\n\nAnd this is fixed in next commit 0ad2f2c32460fef9b8cd59e3920fcfd6602b02a4 after we introduced the `MAX_FEERATE_EXCEEDED` error type.\n\nThe options are;\n- Introduce the error type first, then update` BroadcastTransaction` to support fee rate checks. This approach however, would result in misleading error messages in `sendrawtransaction`.\n- Combine both changes in a single commit.\n- The current approach, update `BroadcastTransaction` to support checking fee rate then introduce the new error type which in my opinion, is the better approach."
  },
  {
   "t": "2024-02-13T11:10:32Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/node/transaction.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1486143881,
   "text": "[quoted text omitted]\n\nsounds good!"
  },
  {
   "t": "2024-02-13T11:12:17Z",
   "kind": "comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "text": "CI failure doesn't make any sense given the lines that you changed in your latest force push. Could be a transient failure or a silent merge conflict? FWIW, I rebased locally on master and ran the functional tests without any failures."
  },
  {
   "t": "2024-02-26T08:21:48Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_psbt.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1473276807,
   "text": "This is fixed, resolving."
  },
  {
   "t": "2024-02-26T16:21:41Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/qt/walletmodel.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": null,
   "text": "in \"[refactor]: rename m_default_max_tx_fee to m_max_tx_fee\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/f1ff2b8f40edffc2b61240a976cff9a9fd51a110):\n\nnit: this commit could be a scripted-diff"
  },
  {
   "t": "2024-02-26T16:30:57Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/spend.cpp",
   "commit": "9255efbe49a63155ced9facc3eeb42ed7c1bddc1",
   "in_reply_to": null,
   "text": "in \"[wallet]: add maxfeerate wallet startup option\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/6a2c7722698d22c95220daf7727f9219ed843042):\n\nThe old `max_tx_fee_rate` on L435 should be deleted:\n\nhttps://github.com/bitcoin/bitcoin/pull/29278/commits/6a2c7722698d22c95220daf7727f9219ed843042#diff-26141d9c7da21eeb4b9e3ffedfaad83212d4710a9e62888f7abea076ca1d0538R435"
  },
  {
   "t": "2024-02-26T16:35:03Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "src/interfaces/chain.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "in \"[node]: update BroadcastTransaction to check fee rate limit\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/368d140db549387fb7bf162c96dd9e9064045103):\n\nnit: in other places, you've been calling this `max_tx_fee_rate`."
  },
  {
   "t": "2024-02-26T16:53:34Z",
   "kind": "review_comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "path": "doc/release-notes-29278.md",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "in \"[doc]: add release notes\" (https://github.com/bitcoin/bitcoin/pull/29278/commits/bf6fc126d1e0b37e490d38124945fa4e8f7475f4):\n\nnit: inconsistent usage of \"fee rate\" vs \"feerate.\" considering \"fee rate\" is what you use in the error messages, that should probably be the one we stick with?"
  },
  {
   "t": "2024-02-26T16:57:13Z",
   "kind": "review",
   "who": "josibake",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "bf6fc126d1e0b37e490d38124945fa4e8f7475f4",
   "text": "Overall, looking good! Left some nits and I noticed inconsistent usage of `feerate` vs `fee_rate` and \"feerate\" vs \"fee rate\" in the PR. I'm not sure which is more correct, considering I've seen both used in the wild, but \"fee rate\" / `fee_rate` _feels_ more correct?"
  },
  {
   "t": "2024-02-27T10:21:21Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "3c77b11d910617239da66c5f2853a1b366c0e6bb"
  },
  {
   "t": "2024-02-27T10:38:27Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "879c048543b1f0239b4650dd0eea2f5215877916"
  },
  {
   "t": "2024-02-27T10:42:25Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/qt/walletmodel.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 1502939030,
   "text": "Thanks, changed to a scripted-diff"
  },
  {
   "t": "2024-02-27T10:42:42Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/spend.cpp",
   "commit": "9255efbe49a63155ced9facc3eeb42ed7c1bddc1",
   "in_reply_to": 1502952390,
   "text": "Deleted \ud83d\udc4d\ud83c\udffe"
  },
  {
   "t": "2024-02-27T10:42:53Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/interfaces/chain.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1502958240,
   "text": "Fixed"
  },
  {
   "t": "2024-02-27T10:45:09Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "doc/release-notes-29278.md",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1502984527,
   "text": "Fixed the inconsistencies added in this PR, I am sticking to fee rate as u suggested, there are still others remaining in the codebase fixing that it is beyond the scope of this PR."
  },
  {
   "t": "2024-02-28T12:57:56Z",
   "kind": "comment",
   "who": "josibake",
   "assoc": "MEMBER",
   "text": "ACK https://github.com/bitcoin/bitcoin/pull/29278/commits/879c048543b1f0239b4650dd0eea2f5215877916"
  },
  {
   "t": "2024-03-05T17:11:16Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "f91accef277bbeb6f957b98f97d2febe618e7142"
  },
  {
   "t": "2024-03-06T11:18:37Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Rebased to fix merge conflict"
  },
  {
   "t": "2024-03-12T20:03:55Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "597665e5cd90db71d66e61020722fd2787b88ff3"
  },
  {
   "t": "2024-03-15T15:41:37Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1473247758,
   "text": "Yeah, I think that currently a lower limit would be better. For a standalone transaction, we could probably go with `2000 sat/vB`, but that might be insufficient for a child transaction bumping a much larger parent. Also see #29661."
  },
  {
   "t": "2024-03-15T15:42:54Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/feebumper.cpp",
   "commit": "394e29b3a508a4bf725df40675f54a80760e0d7a",
   "in_reply_to": 1473256087,
   "text": "Yeah, it will probably be easier to introduce that in the context of a _cluster mempool_ where we would much more easily be able to get a read on the effective feerate at which a transaction would be up for block-inclusion."
  },
  {
   "t": "2024-03-15T15:51:03Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/qt/walletmodel.cpp",
   "commit": "9255efbe49a63155ced9facc3eeb42ed7c1bddc1",
   "in_reply_to": null,
   "text": "Nit:\n\nTypo in the commit message of \"scripted-diff: rename m_default_max_tx_fee to m_max_tx_fee\" (e602fd275f3632fafa9416281cc375ed622e0876):\n\n```diff\n-[\u2026]but con be configured\n+[\u2026]but can be configured\n```"
  },
  {
   "t": "2024-03-15T17:26:45Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/init.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1468533274,
   "text": "I\u2019m also confused by this comment. @luke-jr, could you elaborate what you are suggesting?"
  },
  {
   "t": "2024-03-15T17:51:11Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In \"Wallet: Add maxfeerate wallet startup option\" (e4205cf978d24fe77ce555900e4ae77da12b46ec):\n\nNit: If you are touching a bunch of those lines anyway, is there a chance that you could update `max_fee` to `max_tx_fee`? It\u2019s kinda weird that it\u2019s sometimes with and sometimes without `_tx_`, it would be nice if the name  were consistent to make it easier to search for and make it less confusing."
  },
  {
   "t": "2024-03-15T17:52:20Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In \"Wallet: Add maxfeerate wallet startup option\" (e4205cf978d24fe77ce555900e4ae77da12b46ec):\n\nNit: Regarding `max_tx_fee_rate` vs `-maxfeerate` vs `max_fee_rate` vs                          `DEFAULT_TRANSACTION_MAXFEERATE`\u2014if you are touching a bunch of those lines anyway, is there a chance that you could update `max_fee_rate` to `max_tx_fee_rate`? It\u2019s kinda weird that it\u2019s sometimes with and sometimes without `_tx_`, it would be nice if the name  were consistent to make it easier to search for and make it less confusing."
  },
  {
   "t": "2024-03-15T18:16:16Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "9255efbe49a63155ced9facc3eeb42ed7c1bddc1",
   "in_reply_to": null,
   "text": "Note to self and others: `settxfee` of course sets a _feerate_\u2026 \\*sigh\\*"
  },
  {
   "t": "2024-03-15T18:27:45Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In \"[wallet]: add `maxfeerate` wallet startup option\" (e4205cf978d24fe77ce555900e4ae77da12b46ec):\n\nGiven that we have `max_tx_fee_rate`, `-maxfeerate`, and `max_fee_rate`, should this now perhaps be `DEFAULT_MAX_TRANSACTION_FEERATE` instead of `DEFAULT_TRANSACTION_MAXFEERATE`? I.e. I\u2019m surprised in this constant the \"MAX\" appears between tx and feerate now, when it is appearing before \"tx\" elsewhere?"
  },
  {
   "t": "2024-03-15T18:57:49Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/init.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In \"[wallet]: add maxfeerate wallet startup option\" (e4205cf978d24fe77ce555900e4ae77da12b46ec):\n\nThe help text for this option reads \"Maximum fee rate (in BTC) of a single wallet transaction (default: BTC)\".\n\n\"BTC\" is an amount of bitcoin, not a feerate. Also, the magnitude is missing on the default. Should \"(default: BTC)\" perhaps read \"0.1 BTC/kvB\"? Either way the error description should definitely specify the unit in which the feerate is expected here: `BTC/kvB`, `sat/vB`, or `sat/kvB`?"
  },
  {
   "t": "2024-03-15T19:03:39Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/feebumper.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In \"[wallet]: enforce `-maxfeerate` on wallet transactions\" (7b858d5ee58cd6276b99072e37da90a16954ac1e):\nThis error message should provide a unit for the feerates. If it\u2019s `BTC/kvB`:\n\n```suggestion\n        errors.push_back(strprintf(Untranslated(\"New fee rate %s BTC/kvB is too high (cannot be higher than -maxfeerate %s BTC/kvB)\"),\n            FormatMoney(newFeerate.GetFeePerK()), FormatMoney(wallet.m_max_tx_fee_rate.GetFeePerK())));\n```"
  },
  {
   "t": "2024-03-15T19:16:02Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": null,
   "text": "In \"[wallet]: enforce `-maxfeerate` on wallet transactions\" (7b858d5ee58cd6276b99072e37da90a16954ac1e):\n\nProbably out of the scope of this PR, but I wish this error message provided a unit on those numbers."
  },
  {
   "t": "2024-03-15T19:19:54Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/util/error.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In \"[util]: add a new transaction error type\" (1b350aaf819f9fd1037a2e548c013e7c8c22fef4):\n\nPlease include the transaction\u2019s feerate and the configured maximum in this error message (including the unit)."
  },
  {
   "t": "2024-03-15T19:26:49Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_send.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In \"[wallet]: enforce `-maxfeerate` on wallet transactions\" (7b858d5ee58cd6276b99072e37da90a16954ac1e):\n\nSorry, I\u2019ll have to die in this hill:\n\n**b** = bit\n**B** = byte\n\u21d2 vbyte = **vB**\n\n```suggestion\n        # Wallet will reject any transactions with a fee rate above 10,000 sat/vB.\n```"
  },
  {
   "t": "2024-03-15T19:59:44Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In \"[wallet]: ensure 1kvb tx with -maxtxfee base fee has fee rate atleast `minrelaytxfee`\" (e5b1b43bfdb82fc1b5bc19af04ede21d0de0ff38):\n\n1000\u202fvB is significantly heavier than a minimal useful standard transaction. E.g. a tx with one P2TR input and one P2WPKH output is 99\u202fvB and would have a feerate of 10.1\u202fs/vB at  a fee of 1000 sats. I wouldn\u2019t be surprised if someone at some point had a legitimate reason to set a `max_fee` lower than 1000\u202fsats. Should this therefore perhaps rather just be a warning like above with a `max_fee` above `HIGH_MAX_TX_FEE` instead of an error?"
  },
  {
   "t": "2024-03-15T20:04:18Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In \"[wallet]: ensure 1kvb tx with -maxtxfee base fee has fee rate atleast `minrelaytxfee`\" (e5b1b43bfdb82fc1b5bc19af04ede21d0de0ff38):\n\n1. \"minrelay fee\" is a feerate, not a fee: How about: \"[\u2026] conflicts with the minimum relay transaction feerate [\u2026]\"\n2. \"Consider\" is a bit funny given that the `max_fee` amount was rejected, how about: \"Please set a higher `maxtxfee` or lower `-minrelaytxfee` before retrying.\""
  },
  {
   "t": "2024-03-18T10:27:09Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "cb74e58d6deef3aeaabf1c236ad73a3e11b117f6"
  },
  {
   "t": "2024-03-18T10:27:59Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/qt/walletmodel.cpp",
   "commit": "9255efbe49a63155ced9facc3eeb42ed7c1bddc1",
   "in_reply_to": 1526491361,
   "text": "Fixed"
  },
  {
   "t": "2024-03-18T10:31:03Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1526639115,
   "text": "I added a commit that does that https://github.com/bitcoin/bitcoin/pull/29278/commits/ef8403b79585fd1dfd6e8b0a68923985268be16f\n\nThanks."
  },
  {
   "t": "2024-03-18T10:31:19Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1526640136,
   "text": "Fixed"
  },
  {
   "t": "2024-03-18T11:07:46Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "50d2a010fcd57b58537b711846340c68f6614720"
  },
  {
   "t": "2024-03-18T12:50:38Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/util/error.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1526731236,
   "text": "This will require changing the `TransactionError` utility function to accept this data, most of the error types don't require the data. I thought about  using default parameter and passing the parameter  `MAX_FEE_RATE_EXCEEDED` and `MAX_FEE_EXCEEDED` error type, but it ended up not being a clean refactor as I want  https://github.com/bitcoin/bitcoin/commit/2a20d35b28f73f0ff8e7a1de8b2d3833e7957a09\n\nI will leave this as and fix it in a followup along with [the comment above](https://github.com/bitcoin/bitcoin/pull/29278/#discussion_r1526727709) ?"
  },
  {
   "t": "2024-03-18T12:51:38Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_send.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1526737819,
   "text": "I agree with your suggestion. Fixed"
  },
  {
   "t": "2024-03-18T12:52:18Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1526777732,
   "text": "Fixed, it's now a warning instead a startup failure.."
  },
  {
   "t": "2024-03-18T12:52:42Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1526781002,
   "text": "Reworded to your suggestion"
  },
  {
   "t": "2024-03-18T12:54:01Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/feebumper.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1526714360,
   "text": "Fixed"
  },
  {
   "t": "2024-03-18T12:56:58Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/init.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1526708677,
   "text": "Thats right reworded to \"Maximum fee rate (in `BTC/kvB`) of a single wallet transaction (default: `0.10` `BTC/kvB`)\"  thank you"
  },
  {
   "t": "2024-03-18T12:57:48Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1526678987,
   "text": "Fixed thank you"
  },
  {
   "t": "2024-03-18T12:59:36Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "9255efbe49a63155ced9facc3eeb42ed7c1bddc1",
   "in_reply_to": 1526664705,
   "text": "I think should be updated to `settxfeerate` in a followup?"
  },
  {
   "t": "2024-03-18T13:35:41Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1473247758,
   "text": "[quoted text omitted]\n\nUsers can then restart with a much higher `maxfeerate` whenever they want to feebump a transaction and the limit is hit? but  I reckon restarting may be undesirable.\n\n---\nAnyways whether it's `1000` or `2000` `sat/vB` a sane  maximum transaction fee rate is a function of Block space demand which is unpredictable, what is insane fee rate maybe sane.   Thats why users can pass a lower limit or higher limit based on that factor?\n\nShould I leave as is and continue discussion about this in https://github.com/bitcoin/bitcoin/issues/29661?"
  },
  {
   "t": "2024-03-18T13:47:40Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Thanks for your review @josibake @murchandamus\n\nForce pushed from https://github.com/bitcoin/bitcoin/commit/879c048543b1f0239b4650dd0eea2f5215877916 to https://github.com/bitcoin/bitcoin/commit/50d2a010fcd57b58537b711846340c68f6614720 to address recent review comments by @murchandamus  [compare differences](https://github.com/bitcoin/bitcoin/compare/879c048543b1f0239b4650dd0eea2f5215877916..50d2a010fcd57b58537b711846340c68f6614720)\n\nChanges\n- Rebased for green C.I\n- Updated https://github.com/bitcoin/bitcoin/commit/e602fd275f3632fafa9416281cc375ed622e0876 to fix commit message typo\n- Updated `max_fee` to `max_tx_fee` to fix ambiguity\n- Updated `max_fee_rate` to `max_tx_feerate` to have consistent variable name\n- Also Updated `DEFAULT_TRANSACTION_MAXFEERATE` to `DEFAULT_MAX_TRANSACTION_FEERATE`  for consistency in naming\n- Fix incorrect `maxfeerate` option description to \"Maximum fee rate (in BTC/kvB) of a single wallet transaction (default: 0.10 BTC/kvB)\".\n- Return more verbose error if fee bumping fail when `maxfeerate` limit is hit\n- Updates `sats/vb` to a more accurate description `sat/vB`\n- Fix https://github.com/bitcoin/bitcoin/pull/29278#discussion_r1526777732 comment by returning a warning when creating or loading wallet instead of failing at startup."
  },
  {
   "t": "2024-06-25T11:21:15Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "f6d9ca3392ae38b0123d9ab339cc9908f65c15f6"
  },
  {
   "t": "2024-06-25T11:22:18Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Rebased to fix merge conflict."
  },
  {
   "t": "2024-07-02T17:48:14Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nthanks @maflcko, will fix the C.I"
  },
  {
   "t": "2024-07-03T12:51:51Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "e5d1d25912390954b1a064c5c1f9c5d2c1726430"
  },
  {
   "t": "2024-11-15T18:49:29Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "@DrahtBot  I think C.I failure here is unrelated?\nI was not successful in my attempt to recreate it locally."
  },
  {
   "t": "2024-11-15T19:25:29Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "@maflcko Interestingly I got the error after 5 runs.\n\nlogs\n\n```terminal\n2024-11-15T19:20:59.167000Z TestFramework (INFO): Test issue 22670 ApproximateBestSubset bug\n2024-11-15T19:21:00.082000Z TestFramework (ERROR): JSONRPC error\nTraceback (most recent call last):\n  File \"/Users/abubakarismail/Desktop/Work/bitcoin-dev/bitcoin/test/functional/test_framework/test_framework.py\", line 132, in main\n    self.run_test()\n  File \"/Users/abubakarismail/Desktop/Work/bitcoin-dev/bitcoin/build/test/functional/wallet_fundrawtransaction.py\", line 150, in run_test\n    self.test_22670()\n  File \"/Users/abubakarismail/Desktop/Work/bitcoin-dev/bitcoin/build/test/functional/wallet_fundrawtransaction.py\", line 1434, in test_22670\n    do_fund_send(lower_bound)\n  File \"/Users/abubakarismail/Desktop/Work/bitcoin-dev/bitcoin/build/test/functional/wallet_fundrawtransaction.py\", line 1419, in do_fund_send\n    funded_tx = tester.fundrawtransaction(create_tx)\n                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/Users/abubakarismail/Desktop/Work/bitcoin-dev/bitcoin/test/functional/test_framework/coverage.py\", line 50, in __call__\n    return_val = self.auth_service_proxy_instance.__call__(*args, **kwargs)\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/Users/abubakarismail/Desktop/Work/bitcoin-dev/bitcoin/test/functional/test_framework/authproxy.py\", line 146, in __call__\n    raise JSONRPCException(response['error'], status)\ntest_framework.authproxy.JSONRPCException: Insufficient funds (-4)\n2024-11-15T19:21:00.144000Z TestFramework (INFO): Stopping nodes\n2024-11-15T19:21:00.422000Z TestFramework (WARNING): Not cleaning up dir /var/folders/dj/d8p8jhd172n7wnq81ryfl6rc0000gn/T/bitcoin_func_test_per45s2i\n2024-11-15T19:21:00.422000Z TestFramework (ERROR): Test failed. Test logging available at /var/folders/dj/d8p8jhd172n7wnq81ryfl6rc0000gn/T/bitcoin_func_test_per45s2i/test_framework.log\n2024-11-15T19:21:00.422000Z TestFramework (ERROR):\n2024-11-15T19:21:00.422000Z TestFramework (ERROR): Hint: Call /Users/abubakarismail/Desktop/Work/bitcoin-dev/bitcoin/test/functional/combine_logs.py '/var/folders/dj/d8p8jhd172n7wnq81ryfl6rc0000gn/T/bitcoin_func_test_per45s2i' to consolidate all logs\n2024-11-15T19:21:00.422000Z TestFramework (ERROR):\n2024-11-15T19:21:00.422000Z TestFramework (ERROR): If this failure happened unexpectedly or intermittently, please file a bug and provide a link or upload of the combined log.\n2024-11-15T19:21:00.422000Z TestFramework (ERROR): https://github.com/bitcoin/bitcoin/issues\n2024-11-15T19:21:00.422000Z TestFramework (ERROR):\n```"
  },
  {
   "t": "2025-01-22T20:57:23Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/init.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In bb8b8dcfc2ec4088f7bead133f373ea13a5300be \"[wallet]: add maxfeerate wallet startup option\":\n\n\"of a single wallet transaction\" makes sense with an absolute fee, but the feerate scales with the weight so it doesn\u2019t matter whether it applies to a single transaction or multiple. Perhaps just go with: \"for wallet transactions\":\n\n```suggestion\n    argsman.AddArg(\"-maxfeerate=<amt>\", strprintf(\"Maximum fee rate (in %s/kvB) for wallet transactions (default: %s %s/kvB)\", CURRENCY_UNIT, FormatMoney(DEFAULT_MAX_TRANSACTION_FEERATE.GetFeePerK()), CURRENCY_UNIT), ArgsManager::ALLOW_ANY, OptionsCategory::WALLET);\n```"
  },
  {
   "t": "2025-01-22T21:56:39Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_rawtransaction.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In \"[util]: add a new transaction error type\" (0aa4f2180e6c2dbf77c214e706cf04c054e491dd):\n\nGiven that we now use this value for a feerate and it only appears in this test, let\u2019s name it as such:\n```suggestion\n        fee_rate_exceeds_max = \"Fee rate exceeds maximum configured by user (maxfeerate)\"\n```"
  },
  {
   "t": "2025-01-23T15:44:47Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/feebumper.cpp",
   "commit": "394e29b3a508a4bf725df40675f54a80760e0d7a",
   "in_reply_to": 1473256087,
   "text": "This still seems like a good idea to me. The default max feerate should probably be ~500\u202f\u1e69/vB, but compared to the chunk feerate of the transaction that is being created, rather than the individual feerate. It should probably be addressed in a follow-up, though."
  },
  {
   "t": "2025-01-23T15:55:05Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In \"[wallet]: warn user if 1kvb tx with -maxtxfee base fee has fee rate less than `minrelaytxfee`\" (638a9a3ec0b63e31f92e90dc5822baec925fe4e2):\n\nNit: The grammar in this test title is a bit wonky"
  },
  {
   "t": "2025-01-23T15:59:49Z",
   "kind": "review_comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "path": "src/wallet/test/wallet_tests.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In \"[node]: update BroadcastTransaction to check fee rate limit\" (b480007a4b9341153c4d895176776e0ef93cd200):\n\nIt seems to me that this test was testing whether we can create transactions with the `MAXFEE`. Turning it into `MINFEE` reduces the utility of this test. If the new `MAXFEERATE` interferes with this test, I think it would be better to keep the transaction paying `MAXFEE`, but to increase the `MAXFEERATE` for this one test, to continue testing that `MAXFEE` is permitted in itself."
  },
  {
   "t": "2025-01-23T16:07:49Z",
   "kind": "review",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "state": "APPROVED",
   "commit": "e5d1d25912390954b1a064c5c1f9c5d2c1726430",
   "text": "ACK e5d1d25912390954b1a064c5c1f9c5d2c1726430\n\nI think the MAXFEE \u21a6 MINFEE test issue should still be amended, the rest of my comments are not urgent"
  },
  {
   "t": "2025-01-23T19:28:10Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "970aba08d83af03242bdf658b152c7724ce74947"
  },
  {
   "t": "2025-01-23T19:28:18Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/init.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1925951825,
   "text": "Taken!"
  },
  {
   "t": "2025-01-23T19:28:56Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1927220778,
   "text": "I attempt to rephrase the sentence!\nAlso happy to take explicit suggestion"
  },
  {
   "t": "2025-01-23T19:29:55Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/test/wallet_tests.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1927229571,
   "text": "Done,\nI've switched this to`MAXFEERATE` and pass the tx fee rate as the max."
  },
  {
   "t": "2025-01-23T19:30:08Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_rawtransaction.py",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1926032651,
   "text": "Done"
  },
  {
   "t": "2025-01-23T19:41:41Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "46f0bc5b485130d3e7d14e6855d81d387950cb39"
  },
  {
   "t": "2025-01-23T19:55:28Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Thanks for review @murchandamus\n\nForced pushed from e5d1d25912390954b1a064c5c1f9c5d2c1726430 to 46f0bc5b485130d3e7d14e6855d81d387950cb39 see [diff](https://github.com/bitcoin/bitcoin/compare/e5d1d25912390954b1a064c5c1f9c5d2c1726430..46f0bc5b485130d3e7d14e6855d81d387950cb39)\n\nChanges\n\n1. Improve the description of `maxfeerate` startup option\n2. Update `sendrawtransaction_testmempoolaccept_tests`  `fee_exceeds_max` variable to `fee_rate_exceeds_max`.\n3. Rephrase test log message\n4.  Update `TestSimpleSend` helper transaction fee to use `MAXFEERATE`\n5. Rebased to pickup cmake for easy testing!"
  },
  {
   "t": "2025-01-23T20:19:04Z",
   "kind": "comment",
   "who": "murchandamus",
   "assoc": "MEMBER",
   "text": "ACK https://github.com/bitcoin/bitcoin/pull/29278/commits/46f0bc5b485130d3e7d14e6855d81d387950cb39 per range-diff:\n\n```\ngit range-diff 3714692644f45808a6480525abc36870aeee1de4..e5d1d25912390954b1a064c5c1f9c5d2c1726430 5acf12bafeb126f2190b3f401f95199e0eea90c9..46f0bc5b485130d3e7d14e6855d81d387950cb39\n```"
  },
  {
   "t": "2025-02-20T21:02:35Z",
   "kind": "review_comment",
   "who": "glozow",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/test/wallet_tests.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "This `CFeeRate` construction seem wrong to me - you've swapped the size and fee?"
  },
  {
   "t": "2025-02-20T21:02:40Z",
   "kind": "review_comment",
   "who": "glozow",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/test/wallet_tests.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "same"
  },
  {
   "t": "2025-02-20T21:33:23Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "6dec2d4fed3c6ca8ebef05988fded44ad9051a77"
  },
  {
   "t": "2025-02-20T21:33:48Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/test/wallet_tests.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1964333623,
   "text": "fixed, thanks"
  },
  {
   "t": "2025-02-20T21:33:55Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/test/wallet_tests.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1964333834,
   "text": "fixed"
  },
  {
   "t": "2025-02-20T21:37:19Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Forced pushed https://github.com/bitcoin/bitcoin/compare/46f0bc5b485130d3e7d14e6855d81d387950cb39..6dec2d4fed3c6ca8ebef05988fded44ad9051a77 to fix @glozow  comments"
  },
  {
   "t": "2025-02-22T00:18:54Z",
   "kind": "review_comment",
   "who": "yancyribbens",
   "assoc": "CONTRIBUTOR",
   "path": "doc/release-notes-29278.md",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "```suggestion\n- A new wallet startup option `-maxfeerate` is added.\n```"
  },
  {
   "t": "2025-02-22T00:20:05Z",
   "kind": "review_comment",
   "who": "yancyribbens",
   "assoc": "CONTRIBUTOR",
   "path": "src/qt/walletmodel.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "```suggestion\n        // m_max_tx_fee. This is merely a belt-and-suspenders check).\n```"
  },
  {
   "t": "2025-03-18T10:54:20Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "258a7fafe32bb19f838a32d4a6dea3b11e42aaf0"
  },
  {
   "t": "2025-03-18T10:56:08Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "doc/release-notes-29278.md",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1966342676,
   "text": "Fixed, thanks"
  },
  {
   "t": "2025-03-18T11:09:45Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/qt/walletmodel.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1966343083,
   "text": "fixed"
  },
  {
   "t": "2025-04-11T22:10:31Z",
   "kind": "review_comment",
   "who": "luke-jr",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/init.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1468533274,
   "text": "Something set on each wallet, potentially different for each"
  },
  {
   "t": "2025-05-08T19:09:02Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "31a16093156e1fe5b47c9150f41ccc0012fbb479"
  },
  {
   "t": "2025-05-08T19:34:21Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Rebased to fix merge conflict."
  },
  {
   "t": "2025-05-09T15:42:44Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/init.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 1468533274,
   "text": "I opened a separate issue for this here https://github.com/bitcoin/bitcoin/issues/32462#issue-3052551984"
  },
  {
   "t": "2025-05-13T17:13:33Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "c2db2185523aec53bcb64480c5782de28aa36f4d"
  },
  {
   "t": "2025-08-12T09:11:52Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "908710d008818677b1c3c728cedf46aa72d902d1"
  },
  {
   "t": "2025-08-12T09:16:33Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "29db50da2d6286f49cc603befb60c2f4bea280b0"
  },
  {
   "t": "2025-08-12T09:21:43Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "b592d276923a8a9abb795ec5a7c8a6129534b929"
  },
  {
   "t": "2025-08-13T10:49:40Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "4d6de3cd80bbf96f54bff4f1be9ddd79465f4ca3"
  },
  {
   "t": "2025-08-27T22:34:11Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": null,
   "text": "In 0d9f0888542081b1792705594b570ae748a9f839 \"[wallet]: add `maxfeerate` wallet startup option\"\n\n`-maxtxfee` adds a warning if the max fee is too high. I think it would make sense to have a similar warning for `-maxfeerate`."
  },
  {
   "t": "2025-08-27T22:41:35Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "282007d36381c34a98f3caf4c92666c15192415d",
   "in_reply_to": null,
   "text": "In 99b45844cab7896e206dd0b8e24355586bc1a84d \"[wallet]: warn user if 1kvb tx with `-maxtxfee` base fee has fee rate less than `minrelaytxfee`\"\n\nThis check does not make sense to me. This converts the max tx fee back into a feerate just for this check, even though `-maxfeerate` has taken over that check. I don't think we need to have this check here."
  },
  {
   "t": "2025-08-28T08:45:23Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/wallet/init.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "\u201cfor a wallet transactions\u201d \u2192 \u201cfor wallet transactions\u201d [\u201ca\u201d makes the noun plural \u2018transactions\u2019 ungrammatical]"
  },
  {
   "t": "2025-09-01T14:28:33Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "55c3e5da052268f9a2d5026cce7a74a131d85366"
  },
  {
   "t": "2025-09-01T14:28:51Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 2305442956,
   "text": "Done"
  },
  {
   "t": "2025-09-01T14:40:10Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "282007d36381c34a98f3caf4c92666c15192415d",
   "in_reply_to": 2305470201,
   "text": "This just serves as a floor value for `-maxtxfee`.\n\nSince this is a configurable knob,  there is a \"far-fetched edge case where \" a user could start the node with a value so low that it would prevent creating transactions.\n\nBecause while creating transaction we ensure the fee is not  above `-maxtxfee`.\n\nA more accurate check would use the actual transaction size, but since size varies per transaction, 1000 is chosen arbitrarily. The idea is to calculate the fee rate when the fee is `max_tx_fee` and the size is `1000`.\n\nIf that fee rate is less than minrelaytxfee, we should at least warn the user.\ncc @josibake"
  },
  {
   "t": "2025-09-01T14:40:40Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/init.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 2306701610,
   "text": "Done"
  },
  {
   "t": "2025-09-01T18:43:43Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "C.I Failure is not related see https://github.com/bitcoin/bitcoin/issues/33244"
  },
  {
   "t": "2025-09-01T18:58:10Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "src/wallet/interfaces.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In 9768938066796:\nIt seems you should also change `getDefaultMaxTxFee` for `getMaxTxFee` too."
  },
  {
   "t": "2025-09-01T19:21:05Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "282007d36381c34a98f3caf4c92666c15192415d",
   "in_reply_to": null,
   "text": "In 677be6566b3b998a1d7bf66693c5d9748cf3190c:\n\nIt seems to me that we had certain relation between `max_fee` and `maxfeerate` before that we no longer have. What do you think about parsing `maxfeerate` first so that you could still check any relation between these two configurations? e.g. that `max_tx_fee` isn't ridiculously low/high compared to `maxfeerate`."
  },
  {
   "t": "2025-09-01T19:23:12Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": null,
   "text": "In https://github.com/bitcoin/bitcoin/commit/677be6566b3b998a1d7bf66693c5d9748cf3190c:\n\nnano nit: to not construct `CFeeRate` every time you need it, could extract\n```c++\nCFeeRate max_fee_rate(*max_tx_fee_rate);\n// rest of the code\n```"
  },
  {
   "t": "2025-09-01T19:33:56Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "9255efbe49a63155ced9facc3eeb42ed7c1bddc1",
   "in_reply_to": null,
   "text": "In https://github.com/bitcoin/bitcoin/commit/677be6566b3b998a1d7bf66693c5d9748cf3190c:\n\nthis change smells we are now allowing something that was previously not allowed. Like setting a fee through `settxfee` that is higher than `maxtxfee`."
  },
  {
   "t": "2025-09-01T19:37:07Z",
   "kind": "review",
   "who": "furszy",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "55c3e5da052268f9a2d5026cce7a74a131d85366",
   "text": "(very) light review"
  },
  {
   "t": "2025-09-01T20:10:08Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "9255efbe49a63155ced9facc3eeb42ed7c1bddc1",
   "in_reply_to": 2314502479,
   "text": "Indeed but master is even more smelly because settxfee is not setting tx fee but fee rate :)\nSee discussion https://github.com/bitcoin/bitcoin/pull/31278\nThis effectively corrects that by changing the test to check against maxfeerate.\n\nAre you suggesting that I add a test case that checks that we dont create transaction when the tx fee as a result of the fee rate provided by settxfee is more than maxtxfee?\n\nNote: This wallet RPC is likely going to be removed soon."
  },
  {
   "t": "2025-09-01T20:17:43Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "282007d36381c34a98f3caf4c92666c15192415d",
   "in_reply_to": 2314492088,
   "text": "Hmm, these are different options that can be set for various use cases see comment\nhttps://github.com/bitcoin/bitcoin/pull/29278#issuecomment-1915276592  and https://github.com/bitcoin/bitcoin/pull/29278#issuecomment-1919611531\n\nNot exactly sure which relation do you want a check for because there is already check if bounds for each individual option.\nPerhaps suggest code ?"
  },
  {
   "t": "2025-09-01T20:30:04Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d"
  },
  {
   "t": "2025-09-01T20:30:45Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/interfaces.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 2314472896,
   "text": "Yeah, done."
  },
  {
   "t": "2025-09-01T20:30:55Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "058f3c2b66cec1ee5c0ffd6489f54f757354de9d",
   "in_reply_to": 2314493810,
   "text": "Thanks, fixed."
  },
  {
   "t": "2025-09-01T20:38:16Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "9255efbe49a63155ced9facc3eeb42ed7c1bddc1",
   "in_reply_to": 2314502479,
   "text": "[quoted text omitted]\n\nI\u2019d be surprised if we don\u2019t have a test for that already.\n\n[quoted text omitted]\n\"soon\" is very relative here."
  },
  {
   "t": "2025-09-02T20:10:10Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_bumpfee.py",
   "commit": "9255efbe49a63155ced9facc3eeb42ed7c1bddc1",
   "in_reply_to": 2314502479,
   "text": "[quoted text omitted]\n\nYes we do :)"
  },
  {
   "t": "2025-09-13T00:06:41Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "282007d36381c34a98f3caf4c92666c15192415d",
   "in_reply_to": 2314492088,
   "text": "I was likely thinking of cases where the max tx fee is set below the relay fee rate for any standard tx size but still above the dust limit (iff this is ever possible..).\n\nI assume this already fails on the feerate checks you added, but it might make sense to disallow such a max tx fee in the first place.\n\nIt seems we could compute the feerate for the smallest possible standard tx the wallet could create and reject a max tx fee that would fall below the relay feerate.\n\n---------------\n\nThat being said, I might be overthinking this for no reason. Feel free to close this convo at any time."
  },
  {
   "t": "2025-11-12T17:01:20Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "ef00ee9b41dde3ccc37a0a865bc967f94314eae4"
  },
  {
   "t": "2025-11-24T09:53:17Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "ef00ee9b41dde3ccc37a0a865bc967f94314eae4",
   "in_reply_to": null,
   "text": "// Also the wallet prevents creating transaction with base fee above maxtxfee. -> // Also the wallet prevents creating transactions with base fee above maxtxfee. [\u201ccreating transaction\u201d is ungrammatical; plural or an article is needed for clarity]"
  },
  {
   "t": "2026-01-22T14:05:12Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "92ea90598fb00746b2e92bb2c280838e36ad0c46"
  },
  {
   "t": "2026-01-22T14:05:30Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "ef00ee9b41dde3ccc37a0a865bc967f94314eae4",
   "in_reply_to": 2555503278,
   "text": "Fixed."
  },
  {
   "t": "2026-01-22T14:06:18Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Rebased and fixed C.I  [f94314eae4..92ea905](https://github.com/bitcoin/bitcoin/compare/ef00ee9b41dde3ccc37a0a865bc967f94314eae4..92ea90598fb00746b2e92bb2c280838e36ad0c46)"
  },
  {
   "t": "2026-01-28T14:56:45Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "282007d36381c34a98f3caf4c92666c15192415d"
  },
  {
   "t": "2026-02-05T12:15:28Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "85ebfc485bd46f061b19902dc4ccb2dbf58bd5fe"
  },
  {
   "t": "2026-02-05T12:18:01Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Forced pushed from 282007d36381c34a98f3caf4c92666c15192415d to 85ebfc485bd46f061b19902dc4ccb2dbf58bd5fe compare diff [5192415d..85ebfc48](https://github.com/bitcoin/bitcoin/compare/282007d36381c34a98f3caf4c92666c15192415d..85ebfc485bd46f061b19902dc4ccb2dbf58bd5fe)\n\nThe push is due to a trivial rebase to fix a merge conflict after the merge of #32636\n\nedit\nC.I failure seems unrelated.\nI opened an issue for it separately https://github.com/bitcoin/bitcoin/issues/34516"
  },
  {
   "t": "2026-02-05T23:46:54Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "src/qt/psbtoperationsdialog.cpp",
   "commit": "440508a15deeee99613d80311581629fcf81e6c7",
   "in_reply_to": null,
   "text": "In f184c09015a728482f560d615ca65df1cb6a8012 \"[node]: update `BroadcastTransaction` to check fee rate limit\"\n\nWe should really be using the wallet's limits here if there is one rather than the defaults."
  },
  {
   "t": "2026-02-05T23:49:41Z",
   "kind": "review",
   "who": "achow101",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "85ebfc485bd46f061b19902dc4ccb2dbf58bd5fe",
   "text": "ACK 85ebfc485bd46f061b19902dc4ccb2dbf58bd5fe"
  },
  {
   "t": "2026-02-10T17:56:00Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "src/interfaces/chain.h",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": null,
   "text": "nano nit:\nIt would be nice to introduce a `Restrictions` struct so we can add new limitations with default values without expanding the function signature.\n\nAlso, we could return `util::Result<void>` to avoid passing `err_string` as an argument."
  },
  {
   "t": "2026-02-10T17:56:29Z",
   "kind": "review",
   "who": "furszy",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "85ebfc485bd46f061b19902dc4ccb2dbf58bd5fe",
   "text": "light code review ACK 85ebfc485bd46f061b19902dc4ccb2dbf58bd5fe"
  },
  {
   "t": "2026-02-13T16:54:54Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "9255efbe49a63155ced9facc3eeb42ed7c1bddc1"
  },
  {
   "t": "2026-02-13T17:15:22Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Thanks for your review @achow101 and @furszy.\nI force-pushed from 85ebfc485bd46f061b19902dc4ccb2dbf58bd5fe to 9255efbe49a63155ced9facc3eeb42ed7c1bddc1 because there was a bug in the previous version.\nI opened https://github.com/bitcoin/bitcoin/issues/34516 because I thought the previous C.I failure was unrelated, but @mzumsande and @maflcko helped me debug, and it is indeed related.\n\nIt is deterministically reproducible on my NixOS Ryzen 7 7700 using:\n```\nbuild/test/functional/test_runner.py -j160 (seq 160 | xargs -I{} echo wallet_fundrawtransaction)\n```\nThe issue is that in `createTransactionInternal`, I was using `nBytes` to calculate the fee rate.\nThis is incorrect because `nBytes` is the virtual size calculated using `CalculateMaximumSignedTx`. There are cases where `nBytes` is overestimated, and in that case, the fee rate will turn out to be much lower than it actually is, so the wallet will go ahead and allow creation of the tx.\nBut when we broadcast the tx, `BroadcastTransaction` uses the actual transaction vsize and fee to compute the fee rate  it will turn out to be slightly higher than `maxfeerate`, so the node will not broadcast to peers or add the tx to the mempool. The tx is then marked untrusted and will not be used in future transactions.\nBecause the next test depends on the untrusted tx being available, the test fails with insufficient funds.\nI fixed this by using `GetVirtualTransactionSize` to compute the fee rate.\nAfter that fix, the test failure is now obvious: we fail the `maxfeerate` check because it will be exceeded before proceeding to broadcast the transaction.\nThis can be tested by running f835281aec52bafec9e4255d183ff22057ac8918 without the test changes.\nSo I had to update the test to bump `maxfeerate` to allow creating a tx with a high fee rate.\n`rpc_psbt.py` also relies on high fee rate txs, so I updated the nodes to account for that.\n\nYou can verify the issue no longer happens by running without failure\n\n```\nbuild/test/functional/test_runner.py -j160 (seq 160 | xargs -I{} echo wallet_fundrawtransaction)\n```\n\ncompare diff [bf58bd5fe..9255efb](https://github.com/bitcoin/bitcoin/compare/85ebfc485bd46f061b19902dc4ccb2dbf58bd5fe..9255efbe49a63155ced9facc3eeb42ed7c1bddc1\n)"
  },
  {
   "t": "2026-02-13T17:20:21Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/qt/psbtoperationsdialog.cpp",
   "commit": "440508a15deeee99613d80311581629fcf81e6c7",
   "in_reply_to": 2771623568,
   "text": "I agree defaults should not be used here, but I also think wallet option should not be used either, because it seems to me that using the wallet default is leaking wallet internals to the GUI?\n\nSo I would prefer we instead have a custom value from the GUI, as they want to broadcast transactions like it is implemented with sendrawtransaction now.\nThat is beyond the scope here, but I added a TODO so that we don't forget and it can be picked up in a follow-up."
  },
  {
   "t": "2026-02-13T17:21:14Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/interfaces/chain.h",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 2789430616,
   "text": "I did not take the nit here :) ; it can be done in a follow-up, though."
  },
  {
   "t": "2026-02-24T22:49:28Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "d4f54060eab53523f853b2f1b1a6895b62b7d9e7"
  },
  {
   "t": "2026-03-20T10:27:30Z",
   "kind": "comment",
   "who": "sedited",
   "assoc": "MEMBER",
   "text": "Ping for review, this has four stale ACKs and the last push has been a month ago now."
  },
  {
   "t": "2026-05-29T09:06:23Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "6441f4fdd6c8c3aa04b53f2c23a72ee0a07db396"
  },
  {
   "t": "2026-05-29T11:17:16Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "440508a15deeee99613d80311581629fcf81e6c7"
  },
  {
   "t": "2026-05-29T11:20:26Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Rebased to fix merge conflict.\n\nC.I failure in https://github.com/bitcoin/bitcoin/actions/runs/26634202425/job/78492906366?pr=29278 is unrelated."
  },
  {
   "t": "2026-06-25T17:48:39Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "ebb0978ec2c1237405252ff551b4e481fada9903",
   "in_reply_to": null,
   "text": "in ebb0978ec2c1237405252ff551b4e481fada9903 [wallet]: warn user if 1kvb tx with `-maxtxfee` base fee has fee rate less than `minrelaytxfee`\n\nShouldn't this be an `if` instead of an `else if`?\nIf the previous condition is hit we are skipping this second check."
  },
  {
   "t": "2026-06-25T17:50:08Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "7f802e60d0f020250d17ed71615b075da31f76d2",
   "in_reply_to": null,
   "text": "in 7f802e60d0f020250d17ed71615b075da31f76d2 [wallet]: add `maxfeerate` wallet startup option\n\nnit: There's is no need to double wrap `CFeeRate` objects"
  },
  {
   "t": "2026-06-25T17:50:15Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "7f802e60d0f020250d17ed71615b075da31f76d2",
   "in_reply_to": null,
   "text": "in 7f802e60d0f020250d17ed71615b075da31f76d2 [wallet]: add `maxfeerate` wallet startup option\n\nnit: There's is no need to double wrap `CFeeRate` objects"
  },
  {
   "t": "2026-06-25T17:51:10Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "7f802e60d0f020250d17ed71615b075da31f76d2",
   "in_reply_to": null,
   "text": "in 7f802e60d0f020250d17ed71615b075da31f76d2 [wallet]: add `maxfeerate` wallet startup option\n\nnit:\n\n```suggestion\n//! -maxfeerate default\n```"
  },
  {
   "t": "2026-06-25T17:52:41Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "7f802e60d0f020250d17ed71615b075da31f76d2",
   "in_reply_to": null,
   "text": "in 7f802e60d0f020250d17ed71615b075da31f76d2 [wallet]: add `maxfeerate` wallet startup option\n\n`GetArg` is redundant the first if statement already gets it :)\n\n```suggestion\n            error = AmountErrMsg(\"maxfeerate\", *arg);\n```"
  },
  {
   "t": "2026-06-25T17:53:58Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/node/interfaces.cpp",
   "commit": "eb703acb980b6432dbfd8744dd84129d6e6bcfbb",
   "in_reply_to": null,
   "text": "in eb703acb980b6432dbfd8744dd84129d6e6bcfbb [node]: update `BroadcastTransaction` to check fee rate limit\n\nnit:\n```suggestion\n        return BroadcastTransaction(*m_context, std::move(tx), err_string, max_tx_fee, max_tx_fee_rate, /*broadcast_method=*/TxBroadcast::MEMPOOL_AND_BROADCAST_TO_ALL, /*wait_callback=*/false);\n```"
  },
  {
   "t": "2026-06-25T17:55:35Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/interfaces/chain.h",
   "commit": "eb703acb980b6432dbfd8744dd84129d6e6bcfbb",
   "in_reply_to": null,
   "text": "in eb703ac [node]: update BroadcastTransaction to check fee rate limit\n\nnit: there is an extra white-space after `@param[in]`"
  },
  {
   "t": "2026-06-25T17:56:56Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/wallet/test/wallet_tests.cpp",
   "commit": "eb703acb980b6432dbfd8744dd84129d6e6bcfbb",
   "in_reply_to": null,
   "text": "in eb703ac [node]: update BroadcastTransaction to check fee rate limit\n\nnit:\nHere you use `default_feerate` while in line 666 you use `def_max_feerate`. Is there a reason for this? Maybe use the same variable name for consistency?"
  },
  {
   "t": "2026-06-25T17:58:13Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "test/functional/rpc_psbt.py",
   "commit": "33d693754fb4aca240057ef996601154f2d9ce23",
   "in_reply_to": null,
   "text": "in 33d693754fb4aca240057ef996601154f2d9ce23 [wallet]: enforce `-maxfeerate` on wallet transactions\n\nnit: extra space before wallet arg."
  },
  {
   "t": "2026-06-25T17:59:58Z",
   "kind": "review",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "440508a15deeee99613d80311581629fcf81e6c7",
   "text": "Approach ACK\n\nLeft some comments.\nThe PR is already well worked and reviewed so I mostly have nits before acking it."
  },
  {
   "t": "2026-06-25T18:01:41Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nNote that after #32138 this line of the PR description is outdated."
  },
  {
   "t": "2026-07-01T11:19:31Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "ecd1e5daf6f260b585a8f12d5e9891827c66ce8a"
  },
  {
   "t": "2026-07-01T11:25:52Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Forced pushed from 440508a15deeee99613d80311581629fcf81e6c7 to ecd1e5daf6f260b585a8f12d5e9891827c66ce8a [629fcf81e6c7..ecd1e5da](https://github.com/bitcoin/bitcoin/compare/440508a15deeee99613d80311581629fcf81e6c7..ecd1e5daf6f260b585a8f12d5e9891827c66ce8a)\n\n- https://github.com/bitcoin/bitcoin/pull/29278#discussion_r3476464716, This is correct, I added a test for that.\n- https://github.com/bitcoin/bitcoin/pull/29278#discussion_r3476471363, https://github.com/bitcoin/bitcoin/pull/29278#discussion_r3476471995 Indeed, fixed.\n- https://github.com/bitcoin/bitcoin/pull/29278#discussion_r3476476249, Fixed\n- https://github.com/bitcoin/bitcoin/pull/29278#discussion_r3476484267, Fixed\n- https://github.com/bitcoin/bitcoin/pull/29278#discussion_r3476492912, Fixed\n- https://github.com/bitcoin/bitcoin/pull/29278#discussion_r3476508416 Fixed here and other places.\n- https://github.com/bitcoin/bitcoin/pull/29278#discussion_r3476519276, Coming back now, I also noticed this is hard to read and not dry, and not using adjusted fee rate. I abstracted it and fixed those issues.\n- https://github.com/bitcoin/bitcoin/pull/29278#discussion_r3476528388 Fixed.\n- https://github.com/bitcoin/bitcoin/pull/29278#discussion_r3476528388 Fixed\n- https://github.com/bitcoin/bitcoin/pull/29278#issuecomment-4802684675 Fixed.\n\nThanks for review @polespinasa"
  },
  {
   "t": "2026-07-01T16:50:12Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "6f05410067d3c34c9b37f741bf040d4f32a2cb34"
  },
  {
   "t": "2026-07-03T14:41:53Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/wallet/init.cpp",
   "commit": "c8b78cd9842c5aee02307884233176799ccb262b",
   "in_reply_to": null,
   "text": "in c8b78cd9842c5aee02307884233176799ccb262b [wallet]: add `maxfeerate` wallet startup option\n\nnit: there is a double unit specification\n\n```\n  -maxfeerate=<amt>\n       Maximum fee rate (in BTC/kvB) for wallet transactions (default: 0.10\n       BTC/kvB)\n```\n\nOther arguments don't specify the second `BTC/kvb`:\n```\n  -mintxfee=<amt>\n       Fee rates (in BTC/kvB) smaller than this are considered zero fee for\n       transaction creation (default: 0.00001)\n  -maxapsfee=<n>\n       Spend up to this amount in additional (absolute) fees (in BTC) if it\n       allows the use of partial spend avoidance (default: 0.00)\n -fallbackfee=<amt>\n       A fee rate (in BTC/kvB) that will be used when fee estimation has\n       insufficient data. 0 to entirely disable the fallbackfee feature.\n       (default: 0.00)\n\n```"
  },
  {
   "t": "2026-07-03T15:04:22Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "bfcc63792145cf91c55e97e0011034475fa0d081",
   "in_reply_to": null,
   "text": "in bfcc63792145cf91c55e97e0011034475fa0d081 [wallet]: warn when `-maxtxfee` conflicts with `-minrelaytxfee`\n\nI am not sure about using `args.GetArg` here. Depending on user input the `GetArg` and `chain->relayMinFee().ToString()` will have different number of 0s.\nProbably should use `CFeeRate(max_tx_fee.value(), 1000)`?"
  },
  {
   "t": "2026-07-03T15:13:21Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "doc/release-notes-29278.md",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": null,
   "text": "in 6f05410067d3c34c9b37f741bf040d4f32a2cb34 [doc]: add release notes\n\nProbably worth mentioning the new error type introduced (`MAX_FEE_RATE_EXCEEDED`)."
  },
  {
   "t": "2026-07-03T15:17:17Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/common/messages.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": null,
   "text": "in 2baa98f9fdf6eee148afdb2eb9051641ddb6f5bb [util]: add a new transaction error type\nMissing `-` before `maxtxfee` and `maxfeerate`"
  },
  {
   "t": "2026-07-03T16:37:16Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "d46adaaaaa756627ca28fb1088a8938fa4cea2dc"
  },
  {
   "t": "2026-07-03T16:39:51Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Forced pushed from 6f05410067 to  d46adaaaaa  6f05410067...d46adaaaaa\n\n- https://github.com/bitcoin/bitcoin/pull/29278#discussion_r3520558458 Fixed\n- https://github.com/bitcoin/bitcoin/pull/29278#discussion_r3520673277 Taken, thanks\n- https://github.com/bitcoin/bitcoin/pull/29278#discussion_r3520712934 Yeah, this is a user-facing update, hence added\n- https://github.com/bitcoin/bitcoin/pull/29278#discussion_r3520729752 I am not sure the hyphen is necessary see maxburnamount. I prefer it without. Hence, not taken."
  },
  {
   "t": "2026-07-03T18:20:28Z",
   "kind": "review",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "d46adaaaaa756627ca28fb1088a8938fa4cea2dc",
   "text": ":)\n\nACK d46adaaaaa756627ca28fb1088a8938fa4cea2dc"
  },
  {
   "t": "2026-08-05T12:26:31Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "4da7a2f4d962797018a26031da65c518039e7d7b"
  },
  {
   "t": "2026-08-05T12:29:49Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "Rebased to fix merge conflict in `src/wallet/wallet.cpp`"
  },
  {
   "t": "2026-08-11T11:06:23Z",
   "kind": "review",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "4da7a2f4d962797018a26031da65c518039e7d7b",
   "text": "re-ACK 4da7a2f4d962797018a26031da65c518039e7d7b"
  },
  {
   "t": "2026-08-13T14:23:28Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "src/wallet/spend.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": null,
   "text": "q: shouldn't this contemplate unsigned transactions too? E.g.\n```c++\nconst int64_t tx_vsize{sign ? GetVirtualTransactionSize(*tx) : tx_sizes.vsize};\n```"
  },
  {
   "t": "2026-08-14T21:48:57Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "394e29b3a508a4bf725df40675f54a80760e0d7a"
  },
  {
   "t": "2026-08-14T22:05:48Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/spend.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 3776197834,
   "text": "I think using `tx_sizes.vsize` may overestimate what the fee rate is.\nThat makes the fee rate look lower than it really is, so the wallet may allow a tx that later fails to broadcast due to `maxfeerate`.\n\nSee a similar class of issue here https://github.com/bitcoin/bitcoin/pull/29278#issuecomment-3898336639\nIt's better to false-reject than false accept and fail broadcast?"
  },
  {
   "t": "2026-08-21T08:32:37Z",
   "kind": "comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "text": "What is the status here? Looks like this is a feature with 200+ comments, but no recent acks, tagged for 32.x, but it missed the feature freeze?\n\nMaybe the milestone can be removed for now?"
  },
  {
   "t": "2026-08-21T13:41:56Z",
   "kind": "comment",
   "who": "sedited",
   "assoc": "MEMBER",
   "text": "A bit annoying that this didn't make it given the number of ACKs, but will remove this from the milestone. Would be good to get this in soon for v33."
  },
  {
   "t": "2026-08-27T12:18:44Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": null,
   "text": "in e2b19181a67c9d57e29362a10790ff0e59e74b4a scripted-diff: rename `m_default_max_tx_fee` to `m_max_tx_fee`\n\nnit:\nThe comment seems wrong? The commit message says: \"this value is not always the default...\" and here in the code comment says it is the \"default for the wallet\"."
  },
  {
   "t": "2026-08-27T12:22:33Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/wallet/init.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": null,
   "text": "in c3931437c2f82661602eea1aaeb58d9a5eebd219 [wallet]: add `maxfeerate` wallet startup option\n\nNot introduced by this PR, but why maxtxfee sits under the category `DEBUG_TEST` and not `WALLET` like the other options?"
  },
  {
   "t": "2026-08-27T12:29:28Z",
   "kind": "review_comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": null,
   "text": "in c393143 [wallet]: add maxfeerate wallet startup option\n\nI think this path is not covered by any test. Worth to add a small test for it?\n\nSuggested diff\n\n```diff\n$ git diff\ndiff --git a/test/functional/wallet_send.py b/test/functional/wallet_send.py\nindex da588b9e9c..27ae8b76e1 100755\n--- a/test/functional/wallet_send.py\n+++ b/test/functional/wallet_send.py\n@@ -211,6 +211,24 @@ class WalletSendTest(BitcoinTestFramework):\n         self.restart_node(0, extra_args=['-maxfeerate=0.00001009'])\n         self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), amount=1, fee_rate=Decimal(\"1.009\"))\n\n+        self.log.info(\"Test that -maxfeerate set below -minrelaytxfee is rejected as a hard error.\")\n+        high_min_relay_fee = '0.00020000'  # 20 sat/vB\n+        low_max_fee_rate = '0.0001'        # 10 sat/vB\n+        # The default wallet auto-loads on restart (load_on_startup=True). Unload it first and\n+        # drop it from load-on-startup; otherwise the auto-reload trips the same hard error and\n+        # the node never comes up (LoadWallets calls initError and aborts startup).\n+        self.nodes[0].unloadwallet(self.default_wallet_name, load_on_startup=False)\n+        self.restart_node(0, extra_args=[f'-minrelaytxfee={high_min_relay_fee}', f'-maxfeerate={low_max_fee_rate}'])\n+        msg = (f\"Wallet creation failed. Invalid amount for -maxfeerate=<amount>: '{low_max_fee_rate}' \"\n+               f\"(must be at least the minrelay fee of {high_min_relay_fee} BTC/kvB to prevent stuck transactions)\")\n+        assert_raises_rpc_error(-4, msg, self.nodes[0].createwallet, \"w_maxfeerate_below_minrelay\")\n+        # A -maxfeerate at or above -minrelaytxfee does not trigger the error.\n+        self.restart_node(0, extra_args=[f'-minrelaytxfee={high_min_relay_fee}', '-maxfeerate=0.0003'])\n+        self.nodes[0].createwallet(\"w_maxfeerate_ok\")\n+        # Restore node 0 to defaults and reload the default wallet.\n+        self.restart_node(0)\n+        self.nodes[0].loadwallet(self.default_wallet_name)\n+\n\n     def run_test(self):\n         self.log.info(\"Setup wallets...\")\n\n```"
  },
  {
   "t": "2026-08-27T15:14:06Z",
   "kind": "comment",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "text": "After reviewing this PR again, I asked some clankers to take a look at the code to see if I missed something and they found a bug.\n\ntldr: Using sendall can return `true` for a transaction that can't enter to the mempool as it can be silently paying more fees than the allowed by `-maxfeerate`.\n\nClankers full explanation:\n\n```\nsendall's creation-time -maxfeerate check ignores bump fees for\nunconfirmed inputs, while the broadcast-time check in BroadcastTransaction\nincludes them.  When fee_rate is set exactly equal to -maxfeerate and the\nwallet spends unconfirmed inputs with positive bump fees, the creation check\npasses (equality, ignoring bump fees) but the broadcast check fails (actual\nfee > max_rate.GetFee(actual_vsize)).  The error is silently swallowed by\nCommitTransaction, so sendall returns {\"complete\": true, \"txid\": ...} for a\ntransaction that never entered the mempool.\n```\n\nI've asked the clankers to code a functional test that proves the incorrect behavior: https://github.com/polespinasa/bitcoin/commit/62fa2e2428028043c4462ba5b5431c3d139473d0\n\nA small fix for it could be to take also into account the total_bump_fees for the checks:\n```diff\n$ git diff\ndiff --git a/src/wallet/rpc/spend.cpp b/src/wallet/rpc/spend.cpp\nindex 84b0f4c483..5b2435a9a0 100644\n--- a/src/wallet/rpc/spend.cpp\n+++ b/src/wallet/rpc/spend.cpp\n@@ -1520,10 +1520,11 @@ RPCMethod sendall()\n             const std::optional<CAmount> total_bump_fees{pwallet->chain().calculateCombinedBumpFee(outpoints_spent, fee_rate)};\n             CAmount effective_value = total_input_value - fee_from_size - total_bump_fees.value_or(0);\n\n-            if (fee_from_size > pwallet->m_max_tx_fee) {\n+            const CAmount total_fee{fee_from_size + total_bump_fees.value_or(0)};\n+            if (total_fee > pwallet->m_max_tx_fee) {\n                 throw JSONRPCError(RPC_WALLET_ERROR, TransactionErrorString(TransactionError::MAX_FEE_EXCEEDED).original);\n             }\n-            if (fee_from_size > pwallet->m_max_tx_fee_rate.GetFee(tx_size.vsize)) {\n+            if (total_fee > pwallet->m_max_tx_fee_rate.GetFee(tx_size.vsize)) {\n                 throw JSONRPCError(RPC_WALLET_ERROR, TransactionErrorString(TransactionError::MAX_FEE_RATE_EXCEEDED).original);\n             }\n\n```\n\nPossible a good follow-up to fix this would be to code the TODO in wallet.cpp"
  },
  {
   "t": "2026-09-13T19:46:03Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "e83e86d4fa52f1372d5f7de582abde15a2eadbe3"
  },
  {
   "t": "2026-09-13T19:47:26Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.h",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 3871612666,
   "text": "fixed"
  },
  {
   "t": "2026-09-13T19:47:47Z",
   "kind": "review_comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "path": "src/wallet/wallet.cpp",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "in_reply_to": 3871689822,
   "text": "Taken, thanks"
  },
  {
   "t": "2026-09-13T19:49:49Z",
   "kind": "comment",
   "who": "ismaelsadeeq",
   "assoc": "MEMBER",
   "text": "re: https://github.com/bitcoin/bitcoin/pull/29278#issuecomment-5441203296\n\nGood catch. @polespinasa, I also fixed another variant of the issue in fee bumper and added test coverage.\n\n394e29b3a5...e83e86d4fa"
  },
  {
   "t": "2026-09-15T12:12:17Z",
   "kind": "force_push",
   "who": "ismaelsadeeq",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9"
  },
  {
   "t": "2026-09-15T17:22:57Z",
   "kind": "review",
   "who": "polespinasa",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
   "text": "ACK f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9\n\nThanks for addressing feedback :)"
  }
 ],
 "labels_log": [
  {
   "t": "2024-01-18T22:23:54Z",
   "action": "labeled",
   "label": "RPC/REST/ZMQ",
   "who": "DrahtBot"
  },
  {
   "t": "2024-01-25T21:53:16Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-01-25T23:19:55Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-02-05T07:38:14Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-02-05T10:18:09Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-02-27T10:38:32Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-02-27T19:43:56Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-03-05T12:45:35Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-03-05T18:49:59Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-03-05T18:51:31Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-03-05T19:26:01Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-03-09T02:12:52Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-03-12T20:26:38Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-03-18T11:07:51Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-03-18T12:20:43Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-03-29T05:53:44Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-04-03T16:33:11Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-06-12T22:36:16Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-06-25T12:30:57Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2024-06-30T13:26:04Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-07-03T14:23:05Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-11T19:42:38Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-08-17T21:27:47Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-10-20T11:04:14Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-10-24T16:14:15Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-11-12T10:38:20Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2024-11-16T08:44:36Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-01-23T19:41:47Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-01-23T21:36:57Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-13T21:58:59Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-15T11:32:39Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-27T07:45:46Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-05-08T21:28:23Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-08-12T09:16:51Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-08-13T14:02:50Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-09-01T16:56:22Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-09-02T08:37:15Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-10-31T19:18:01Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-11-12T17:17:12Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-11-12T19:18:34Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-12T22:05:13Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-28T16:44:27Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-28T19:09:09Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-04T20:40:47Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-05T12:21:34Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-05T13:49:31Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-10T18:10:34Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "maflcko"
  },
  {
   "t": "2026-02-10T18:10:40Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "maflcko"
  },
  {
   "t": "2026-02-13T18:28:28Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-19T02:38:08Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-02-25T00:39:29Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-03-20T10:27:45Z",
   "action": "labeled",
   "label": "Wallet",
   "who": "sedited"
  },
  {
   "t": "2026-05-19T16:33:13Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-29T11:45:31Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-29T12:28:25Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-29T16:16:15Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-07-01T12:21:37Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-07-01T17:51:09Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-04T23:00:40Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-05T14:09:40Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-14T17:55:33Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-14T22:33:12Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-14T13:43:18Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-15T13:42:32Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  }
 ],
 "state_log": [
  {
   "t": "2024-01-18T22:24:40Z",
   "kind": "renamed",
   "who": "ismaelsadeeq",
   "from": "RPC: Wallet:  Add `maxfeerate` and `maxburnamount` startup option and use `maxfeerate` to check max wallet tx feerate",
   "to": "RPC: Wallet:  Add `maxfeerate` and `maxburnamount` startup option"
  },
  {
   "t": "2024-01-19T16:12:23Z",
   "kind": "convert_to_draft",
   "who": "ismaelsadeeq"
  },
  {
   "t": "2024-01-25T22:05:58Z",
   "kind": "renamed",
   "who": "ismaelsadeeq",
   "from": "RPC: Wallet:  Add `maxfeerate` and `maxburnamount` startup option",
   "to": " Wallet:  Add `maxfeerate` wallet startup option"
  },
  {
   "t": "2024-01-25T22:06:01Z",
   "kind": "renamed",
   "who": "DrahtBot",
   "from": " Wallet:  Add `maxfeerate` wallet startup option",
   "to": "Wallet:  Add `maxfeerate` wallet startup option"
  },
  {
   "t": "2024-01-25T22:19:47Z",
   "kind": "ready_for_review",
   "who": "ismaelsadeeq"
  },
  {
   "t": "2025-12-09T12:42:24Z",
   "kind": "convert_to_draft",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-22T14:06:24Z",
   "kind": "ready_for_review",
   "who": "ismaelsadeeq"
  },
  {
   "t": "2026-07-01T10:22:06Z",
   "kind": "milestoned",
   "who": "sedited"
  },
  {
   "t": "2026-08-21T13:42:10Z",
   "kind": "demilestoned",
   "who": "sedited"
  }
 ],
 "text_chars": 69718,
 "text_tokens_estimate": 17429,
 "changed_paths": [
  "doc/release-notes-29278.md",
  "src/common/messages.cpp",
  "src/dummywallet.cpp",
  "src/interfaces/chain.h",
  "src/interfaces/node.h",
  "src/interfaces/wallet.h",
  "src/node/interfaces.cpp",
  "src/node/transaction.cpp",
  "src/node/transaction.h",
  "src/node/types.h",
  "src/qt/psbtoperationsdialog.cpp",
  "src/qt/sendcoinsdialog.cpp",
  "src/qt/walletmodel.cpp",
  "src/rpc/mempool.cpp",
  "src/test/fuzz/kitchen_sink.cpp",
  "src/wallet/feebumper.cpp",
  "src/wallet/init.cpp",
  "src/wallet/interfaces.cpp",
  "src/wallet/rpc/spend.cpp",
  "src/wallet/spend.cpp",
  "src/wallet/test/wallet_tests.cpp",
  "src/wallet/wallet.cpp",
  "src/wallet/wallet.h",
  "test/functional/rpc_psbt.py",
  "test/functional/rpc_rawtransaction.py",
  "test/functional/wallet_bumpfee.py",
  "test/functional/wallet_create_tx.py",
  "test/functional/wallet_fundrawtransaction.py",
  "test/functional/wallet_send.py",
  "test/functional/wallet_sendall.py"
 ],
 "files": [
  {
   "path": "doc/release-notes-29278.md",
   "add": 17,
   "del": 0
  },
  {
   "path": "src/common/messages.cpp",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/dummywallet.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/interfaces/chain.h",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/interfaces/node.h",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/interfaces/wallet.h",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/node/interfaces.cpp",
   "add": 7,
   "del": 11
  },
  {
   "path": "src/node/transaction.cpp",
   "add": 8,
   "del": 8
  },
  {
   "path": "src/node/transaction.h",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/node/types.h",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/qt/psbtoperationsdialog.cpp",
   "add": 4,
   "del": 1
  },
  {
   "path": "src/qt/sendcoinsdialog.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/qt/walletmodel.cpp",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/rpc/mempool.cpp",
   "add": 3,
   "del": 9
  },
  {
   "path": "src/test/fuzz/kitchen_sink.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/wallet/feebumper.cpp",
   "add": 8,
   "del": 1
  },
  {
   "path": "src/wallet/init.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/wallet/interfaces.cpp",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/wallet/rpc/spend.cpp",
   "add": 6,
   "del": 2
  },
  {
   "path": "src/wallet/spend.cpp",
   "add": 6,
   "del": 1
  },
  {
   "path": "src/wallet/test/wallet_tests.cpp",
   "add": 16,
   "del": 5
  },
  {
   "path": "src/wallet/wallet.cpp",
   "add": 35,
   "del": 13
  },
  {
   "path": "src/wallet/wallet.h",
   "add": 9,
   "del": 2
  },
  {
   "path": "test/functional/rpc_psbt.py",
   "add": 6,
   "del": 4
  },
  {
   "path": "test/functional/rpc_rawtransaction.py",
   "add": 9,
   "del": 3
  },
  {
   "path": "test/functional/wallet_bumpfee.py",
   "add": 60,
   "del": 2
  },
  {
   "path": "test/functional/wallet_create_tx.py",
   "add": 4,
   "del": 4
  },
  {
   "path": "test/functional/wallet_fundrawtransaction.py",
   "add": 14,
   "del": 6
  },
  {
   "path": "test/functional/wallet_send.py",
   "add": 31,
   "del": 0
  },
  {
   "path": "test/functional/wallet_sendall.py",
   "add": 43,
   "del": 0
  }
 ],
 "test_lines": 208,
 "git": {
  "head": "f69e56bc1c43ca2bebd4d733bce1afc8de8f58b9",
  "head_matches_backup": true,
  "base": "51ddab532cb38213e2258c24c492bc8a392ffc90",
  "commits": [
   {
    "sha": "a9c39696f4",
    "subject": "scripted-diff: rename `m_default_max_tx_fee` to `m_max_tx_fee`",
    "files": 9,
    "add": 11,
    "del": 11
   },
   {
    "sha": "6b913b6224",
    "subject": "doc: add missing verb to make sentence readable",
    "files": 1,
    "add": 1,
    "del": 1
   },
   {
    "sha": "607568f2b0",
    "subject": "[wallet]: update `max_fee` to `max_tx_fee`",
    "files": 2,
    "add": 12,
    "del": 12
   },
   {
    "sha": "7bfce65801",
    "subject": "[wallet]: add `maxfeerate` wallet startup option",
    "files": 5,
    "add": 39,
    "del": 3
   },
   {
    "sha": "633c08d3f7",
    "subject": "[node]: update `BroadcastTransaction` to check fee rate limit",
    "files": 11,
    "add": 54,
    "del": 38
   },
   {
    "sha": "d2c832e9e7",
    "subject": "[util]: add a new transaction error type",
    "files": 9,
    "add": 17,
    "del": 13
   },
   {
    "sha": "df1feeb487",
    "subject": "[wallet]: enforce `-maxfeerate` on wallet transactions",
    "files": 8,
    "add": 120,
    "del": 10
   },
   {
    "sha": "40ab7aa90d",
    "subject": "[wallet]: warn when `-maxtxfee` conflicts with `-minrelaytxfee`",
    "files": 2,
    "add": 41,
    "del": 0
   },
   {
    "sha": "f69e56bc1c",
    "subject": "[doc]: add release notes",
    "files": 1,
    "add": 17,
    "del": 0
   }
  ],
  "patch_truncated": true
 },
 "input_hash": "ab5db1e9858f8119",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}