Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
231 commits
Select commit Hold shift + click to select a range
ccdc763
test: reduce feature_llmq_connections node count to 11
thepastaclaw Jul 30, 2026
483b3d7
Merge bitcoin/bitcoin#25740: assumeutxo: background validation comple…
PastaPastaPasta Jul 11, 2026
19a28d8
ci: drop Berkeley DB from the asan job, extend the Qt lsan suppressions
knst Aug 11, 2026
3344adb
fix: multiple return undocumented or misdocumented JSON
knst Jul 29, 2026
f2e13f0
Merge bitcoin/bitcoin#23083: rpc: Fail to return undocumented or misd…
knst Mar 28, 2022
b77fd4a
partial Merge bitcoin/bitcoin#34683: rpc: support a formal descriptio…
knst Mar 3, 2026
9cfc65a
backport: adapt Dash EvoDB completion path for bitcoin#25740
PastaPastaPasta Jul 11, 2026
3da9105
Merge bitcoin/bitcoin#27862: validation: Stricter assumeutxo error ha…
PastaPastaPasta Jul 11, 2026
d1ffdd6
Merge bitcoin/bitcoin#28050: test: make assumeUTXO test capture the e…
PastaPastaPasta Jul 11, 2026
43efc47
Merge bitcoin/bitcoin#27746: Rework validation logic for assumeutxo
ryanofsky Jul 31, 2023
2ef1222
backport: adapt bitcoin#27746 for Dash
PastaPastaPasta Jul 11, 2026
44bd797
refactor: share the block-data-unavailable sentinel as a named constant
PastaPastaPasta Aug 7, 2026
ab3b671
validation: move the mempool to the snapshot chainstate on activation
PastaPastaPasta Aug 7, 2026
cedba66
docs: note the cross-chainstate duplicate-commitment corner
PastaPastaPasta Aug 7, 2026
4b1294c
test: assert cold snapshot activation captures no base MN-list marker
PastaPastaPasta Aug 7, 2026
413afb1
fix: report a missing snapshot base block as a startup error, not an …
PastaPastaPasta Aug 11, 2026
d16440b
refactor: centralize durable rename/remove for the snapshot lifecycle
PastaPastaPasta Aug 11, 2026
a8b6790
docs: fix stale check_block_index reference and explain deferred cand…
PastaPastaPasta Aug 11, 2026
c28ddc8
test: cover background MN-hash erase and the promote/discard recovery…
PastaPastaPasta Aug 11, 2026
c9fa309
fix(rpc): refuse to pay Platform addresses before the v24 hard fork
PastaPastaPasta Aug 11, 2026
229e18b
Merge bitcoin/bitcoin#29144: init: handle empty settings file gracefully
achow101 Jan 23, 2024
45a3ab2
Merge bitcoin/bitcoin#28946: init: don't delete PID file if it was no…
achow101 Dec 4, 2023
b1eacde
Merge bitcoin/bitcoin#28980: rpc: encryptwallet help, mention HD seed…
achow101 Dec 6, 2023
19cc3ec
Merge bitcoin/bitcoin#28554: bugfix: throw an error if an invalid par…
achow101 Nov 28, 2023
f99d9c3
(Partial) Merge bitcoin/bitcoin#28414: wallet rpc: return final tx he…
achow101 Sep 12, 2023
c30e901
Merge #7576: ci: drop Berkeley DB from the asan job, extend the Qt ls…
PastaPastaPasta Aug 12, 2026
4b7e21f
fix: bound pending DKG message retention per proTxHash
PastaPastaPasta Aug 12, 2026
cf85283
test: cover per-proTx DKG pending-message quotas
PastaPastaPasta Aug 12, 2026
c788be7
Merge #7553: backport: assumeutxo M3 — background validation completi…
PastaPastaPasta Aug 12, 2026
04caf09
refactor: share snapshot lifecycle dir suffixes between writers and r…
PastaPastaPasta Aug 12, 2026
8cd7f27
refactor: hoist chainstate enumeration out of the flag-reset admissio…
PastaPastaPasta Aug 12, 2026
d4851d8
chore: drop duplicated snapshot base-height assert
PastaPastaPasta Aug 12, 2026
3e6616c
Merge #7585: refactor: assumeutxo M3 review follow-ups
PastaPastaPasta Aug 12, 2026
856ce1d
Merge #7583: fix: bound pending DKG message retention per proTxHash
PastaPastaPasta Aug 12, 2026
2aefa6e
perf(llmq): deserialize DKG messages once
PastaPastaPasta Aug 7, 2026
90bf725
test: add dkg_message_framing fuzz target
PastaPastaPasta Aug 7, 2026
5d46561
test: cover DKG pending-queue quotas and worker-deferred BLS rejection
PastaPastaPasta Aug 7, 2026
9d93f74
fix: more fixes for RPCHelp: getcoinjoininfo, getwalletinfo
knst Aug 12, 2026
498a1ae
fix(util): handle the UINT64_MAX-containing range in CRangesSet
PastaPastaPasta Aug 12, 2026
583a330
Merge #7587: fix(util): handle the UINT64_MAX-containing range in CRa…
PastaPastaPasta Aug 12, 2026
0d092f5
fix: avoid maybe-uninitialized warning in ScopedBLSLegacyScheme
PastaPastaPasta Aug 12, 2026
76c38fa
Merge #7586: fix: avoid maybe-uninitialized warning in ScopedBLSLegac…
PastaPastaPasta Aug 12, 2026
8b200cd
fix: make the wrapped successor explicit in CRangesSet under -fsaniti…
PastaPastaPasta Aug 12, 2026
981a25d
Merge #7590: fix: make the wrapped successor explicit in CRangesSet u…
PastaPastaPasta Aug 13, 2026
2974474
fix: make CoinJoin nSessionDenom atomic
PastaPastaPasta Aug 3, 2026
ea1deec
fix(coinjoin): snapshot collaterals before random fee charging
PastaPastaPasta Aug 13, 2026
3f4eadd
fix(coinjoin): revalidate DSA session before admission
PastaPastaPasta Aug 13, 2026
9bf0816
fix: changed type of mapped_as for rpc help
knst Aug 13, 2026
2addaf8
fix: skip old budget block value checks while not synced
UdjinM6 Aug 13, 2026
c00067d
test: cover old budget window block values during and after sync
UdjinM6 Aug 13, 2026
ec52988
Merge #7577: fix(rpc): refuse to pay Platform addresses before the v2…
PastaPastaPasta Aug 13, 2026
4511cc4
Merge #7502: backport: bitcoin/bitcoin#23083: rpc: Fail to return und…
PastaPastaPasta Aug 13, 2026
dc4e364
Merge bitcoin/bitcoin#25122: rpc: getreceivedbylabel, return early if…
knst May 23, 2022
88be189
Merge bitcoin/bitcoin#25504: RPC: allow to track coins by parent desc…
knst Aug 16, 2022
7589268
Merge bitcoin/bitcoin#25647: wallet: return change from SelectionResult
knst Aug 22, 2022
9024c33
Merge bitcoin/bitcoin#25924: scripted-diff: rpc: fix rescan RPC name …
knst Aug 25, 2022
3a54613
Merge bitcoin/bitcoin#25768: wallet: Properly rebroadcast unconfirmed…
knst Sep 5, 2022
c2d21b5
Merge bitcoin/bitcoin#26091: test: Fix syncwithvalidationinterfaceque…
knst Sep 15, 2022
9f7bae5
Merge bitcoin/bitcoin#26037: test: Fix `wallet_{basic,listsinceblock}…
knst Sep 8, 2022
427067d
Merge bitcoin/bitcoin#25990: test: apply fixed feerate to avoid varia…
knst Sep 9, 2022
ad13ec2
Merge bitcoin/bitcoin#26021: wallet: bugfix, load a wallet with an un…
knst Sep 13, 2022
b4dab95
Merge bitcoin/bitcoin#26205: wallet: #25768 follow ups
knst Oct 13, 2022
6d1968b
Merge bitcoin/bitcoin#26203: wallet: Use correct effective value when…
knst Oct 4, 2022
7e03275
Merge #7596: fix: revalidate CoinJoin DSA session before admission
PastaPastaPasta Aug 13, 2026
3e2bc49
Merge #7598: fix: snapshot CoinJoin collaterals before random fee cha…
PastaPastaPasta Aug 13, 2026
9297f19
Merge #7550: backport: bitcoin#25122, #25504, #25647, #25768, #25924,…
PastaPastaPasta Aug 13, 2026
a325fdb
test: suppress QDBus watcher QThread leak in lsan
PastaPastaPasta Aug 12, 2026
b2a0e47
Merge #7597: fix: make CoinJoin session denomination atomic
PastaPastaPasta Aug 13, 2026
b3e5295
Merge #7499: test: reduce nodes in LLMQ connections test
PastaPastaPasta Aug 13, 2026
82a1cc7
fix(llmq): reject response errors in QGETDATA requests
PastaPastaPasta Aug 13, 2026
9c3f4ff
fix(bls): cleanse generated secret candidate
PastaPastaPasta Aug 13, 2026
956e1e0
fix(wallet): serialize mixing-only lock state
PastaPastaPasta Aug 13, 2026
c42c883
Merge #7607: fix(wallet): serialize mixing-only lock state
PastaPastaPasta Aug 13, 2026
1a32e0e
test: cover special QGETDATA error bytes
PastaPastaPasta Aug 13, 2026
51496f0
Merge #7604: fix: skip old budget block value checks while not synced
PastaPastaPasta Aug 13, 2026
aa6eaa8
test: suppress leaks from Qt binaries
PastaPastaPasta Aug 13, 2026
837a7da
Merge #7606: fix: cleanse generated BLS secret candidate
PastaPastaPasta Aug 13, 2026
892281e
fix(coinjoin): bind entry admission to session snapshot
PastaPastaPasta Aug 13, 2026
06501c3
Merge #7605: fix(net): reject response errors in QGETDATA requests
PastaPastaPasta Aug 13, 2026
ada242d
Merge #7589: test: suppress Qt executable leaks in lsan
PastaPastaPasta Aug 13, 2026
3b865cf
Merge #7557: perf: deserialize DKG messages once (framing-only intake)
PastaPastaPasta Aug 15, 2026
ec3d0ef
feat(qt): identify masternode transactions in history
PastaPastaPasta Aug 15, 2026
314a3d5
docs: add release notes for masternode history
PastaPastaPasta Aug 15, 2026
acb01a2
refactor(evo): extract shared provider network-field validation
PastaPastaPasta Aug 15, 2026
107171b
test: wait for MN disconnect after in-place ProUpServ migration
PastaPastaPasta Aug 13, 2026
b7da66f
Merge #7595: feat(qt): identify masternode transactions in history
PastaPastaPasta Aug 15, 2026
b2a42d2
Merge #7610: test: wait for MN disconnect after in-place ProUpServ mi…
PastaPastaPasta Aug 16, 2026
ca442a6
test: call IsValidInOuts directly in denom-snapshot regression test
PastaPastaPasta Aug 16, 2026
dc08f2f
fix(qt): remove regression test that depends on filter entry order
knst Aug 16, 2026
75df77a
fix(qt): persist transaction type filter by value instead of combo index
knst Aug 16, 2026
2bcb6c4
test(qt): drop transaction long-description rendering checks
knst Aug 16, 2026
e5d1c57
test(qt): drop redundant TxPlainTextRole checks
knst Aug 16, 2026
11fd254
test: tighten error message in masternode_payments_tests
knst Aug 16, 2026
bde93a4
feat(interfaces): add wallet fund, sign and coin-lock primitives
PastaPastaPasta Aug 15, 2026
f2e0ed5
refactor(evo): expose typed provider transaction operations
PastaPastaPasta Aug 15, 2026
63c1d8b
Merge #7613: test: tighten error message in masternode_payments_tests
PastaPastaPasta Aug 17, 2026
93c47eb
refactor(coinjoin): use static_cast for entry count checks
PastaPastaPasta Aug 17, 2026
5809821
fix: re-ordering list of filters to put Masternode between "Mined" an…
knst Aug 16, 2026
ad7a524
Merge #7599: fix: bind CoinJoin entry admission to session snapshot
PastaPastaPasta Aug 17, 2026
885a46c
fix(rpc): reject incompletely signed provider transactions
PastaPastaPasta Aug 15, 2026
bb24dc8
test(qt): match CoinJoin type-filter entries by title, not a copied list
knst Aug 17, 2026
0ec62ed
fix(llmq): bound QGETDATA request tracking
PastaPastaPasta Aug 13, 2026
12e6389
docs: clarify when to use assert vs Assert vs Assume vs CHECK_NONFATAL
PastaPastaPasta Aug 17, 2026
12f5ba2
Merge #7600: refactor(interfaces): expose typed provider transaction …
PastaPastaPasta Aug 17, 2026
a1de5f6
refactor(rpc, wallet): address review feedback on provider transactio…
PastaPastaPasta Aug 17, 2026
e454918
refactor: replace C-style and functional casts in Dash code
PastaPastaPasta Aug 17, 2026
9fbc7e2
lint: prohibit C-style and functional casts in Dash code
PastaPastaPasta Aug 17, 2026
047aa52
refactor: expose masternode Platform endpoints, quorum keys and isloc…
PastaPastaPasta Aug 13, 2026
340be85
test: move mined-commitment EvoDB helpers into llmq test utils
PastaPastaPasta Aug 17, 2026
ae11a9d
test: cover Platform endpoint, quorum and islock node interface seams
PastaPastaPasta Aug 17, 2026
3b8fc64
feat(wallet): add Platform (DIP-9/13/14/15) key derivation helpers
PastaPastaPasta Aug 12, 2026
c6fe429
feat(wallet): add generic per-wallet Platform data records
PastaPastaPasta Aug 12, 2026
01c8a8a
feat(wallet): add DIP-15 friendship keychain import and platform key …
PastaPastaPasta Aug 12, 2026
a67dbc2
fix(wallet): validate parent pubkey before DIP-14 public derivation
PastaPastaPasta Aug 12, 2026
d583a42
fix(wallet): fail platform seed selection when the pinned seed is una…
PastaPastaPasta Aug 12, 2026
2cd5bcd
fix(wallet): preserve friendship descriptor state on re-import
PastaPastaPasta Aug 12, 2026
005459f
fix(wallet): drop platform data from memory only after the database e…
PastaPastaPasta Aug 12, 2026
31637d7
fix(wallet): fail platform seed selection on a malformed seed pin
PastaPastaPasta Aug 12, 2026
3a430b5
fix(wallet): require a full unlock before serving the legacy platform…
PastaPastaPasta Aug 12, 2026
47c0751
test(wallet): pin friendship derivation against rust-dashcore key-wallet
PastaPastaPasta Aug 13, 2026
b78f3cf
chore(wallet): annotate m_platform_data locking, add missing includes
PastaPastaPasta Aug 13, 2026
80a46ec
fix(wallet): skip empty-mnemonic descriptors in platform seed selection
PastaPastaPasta Aug 13, 2026
3f954b4
fix(wallet): reject unknown platform key types before derivation
PastaPastaPasta Aug 13, 2026
b1da3d4
fix(wallet): treat corrupt platform data records as wallet corruption
PastaPastaPasta Aug 13, 2026
d5e41f4
refactor(wallet): drop the unused friendship import label parameter
PastaPastaPasta Aug 13, 2026
d58facb
fix(wallet): keep damaged Platform cache records noncritical on load
PastaPastaPasta Aug 17, 2026
6a92a1c
fix(wallet): validate mnemonics before deriving the platform seed
PastaPastaPasta Aug 17, 2026
f77b9e1
Merge #7616: refactor(rpc, wallet): address review feedback on provid…
PastaPastaPasta Aug 18, 2026
9291823
Merge #7591: refactor: expose masternode Platform endpoints, quorum k…
PastaPastaPasta Aug 18, 2026
ffa4fbc
Merge #7615: docs: clarify when to use assert vs Assert vs Assume vs …
PastaPastaPasta Aug 18, 2026
8b6371a
Merge #7614: refactor: prohibit C-style and functional casts in Dash …
PastaPastaPasta Aug 18, 2026
f03aac1
Merge #7612: fix: re-ordering list of filters to put Masternode betwe…
PastaPastaPasta Aug 18, 2026
49d7d5f
feat: coinjoin promotion / demotion
PastaPastaPasta Jul 10, 2026
3d6d49a
test: cover CoinJoin promotion/demotion validation and decision logic
PastaPastaPasta Jul 10, 2026
33702b4
docs: add release notes for pr 7052
PastaPastaPasta Jul 10, 2026
9c29052
feat(coinjoin): gate rebalance sessions and require session-denom cover
PastaPastaPasta Aug 1, 2026
363d305
fix(coinjoin): tolerate one-block tip skew only at the V24 boundary
PastaPastaPasta Aug 1, 2026
efff25c
fix(coinjoin): only announce unbalanced DSTXes to peers that support …
PastaPastaPasta Aug 1, 2026
9cae6f4
feat(coinjoin): reset mixing rounds on promotion/demotion outputs
PastaPastaPasta Aug 1, 2026
9e83d6a
fix(coinjoin): don't announce oversized balanced DSTXes to legacy peers
PastaPastaPasta Aug 17, 2026
88d4e6b
fix(coinjoin): guard against null prevtx in GetRealOutpointCoinJoinRo…
PastaPastaPasta Aug 17, 2026
9727337
fix(coinjoin): keep relaying islocks when withholding a DSTX from leg…
PastaPastaPasta Aug 17, 2026
50c62c9
fix(coinjoin): annotate m_fRebalanceSession as GUARDED_BY(cs_coinjoin)
PastaPastaPasta Aug 17, 2026
f7d2bbb
fix(coinjoin): bind entry admission and charging to the validated ses…
PastaPastaPasta Aug 18, 2026
1ff74e9
fix(coinjoin): latch rebalance capability on admission, not on creato…
PastaPastaPasta Aug 18, 2026
032bc99
fix(coinjoin): widen the V24 DSTX skew tolerance and downgrade withhe…
PastaPastaPasta Aug 18, 2026
428eb97
fix(coinjoin): recognize unbalanced mixing transactions as denominated
PastaPastaPasta Aug 18, 2026
6af461c
fix(coinjoin): scale the rebalance gap threshold with the denoms goal
PastaPastaPasta Aug 18, 2026
e78b965
test(coinjoin): cover session finalization race and gap-threshold bou…
PastaPastaPasta Aug 18, 2026
5748316
refactor(coinjoin): use static_cast in new promotion/demotion code
PastaPastaPasta Aug 18, 2026
0dc132f
docs: describe rebalance session gating and DSTX downgrade accurately
PastaPastaPasta Aug 18, 2026
3646c95
fix(coinjoin): tolerate DSTX tip skew from V24 lock-in, and address r…
PastaPastaPasta Aug 18, 2026
449da14
wallet: make the Platform seed provider descriptor-wallet-only
PastaPastaPasta Aug 18, 2026
e6687d9
fix(coinjoin): tolerate arbitrary tip skew when validating a final tr…
PastaPastaPasta Aug 18, 2026
f232f02
fix(coinjoin): keep the V24 tip-skew tolerance at one block
PastaPastaPasta Aug 18, 2026
123858d
fix(coinjoin): don't burn queue announcements a rebalance pass skips
UdjinM6 Aug 17, 2026
26d0a98
fix(coinjoin): tell participants when an uncovered session is reset
UdjinM6 Aug 17, 2026
adb2765
fix(coinjoin): bound the sides of a post-V24 DSTX against each other
UdjinM6 Aug 18, 2026
81ba952
refactor(wallet): confine Platform derivation to key managers
PastaPastaPasta Aug 18, 2026
939ee20
refactor(wallet): avoid serializing friendship xprv
PastaPastaPasta Aug 18, 2026
46308fc
refactor: move evodb initialization out from LoadChainState
knst Aug 6, 2026
aa8151f
refactor: move CInstantSendManager out of LLMQContext
knst Aug 12, 2026
e5cee04
refactor: pass dmnman and isman to CTxMemPool at construction
knst Aug 12, 2026
213c60a
chore: add todo to make isman optional for bitcoin chainstate
knst Aug 13, 2026
0447697
refactor: make CTxMemPool manager members references
knst Aug 12, 2026
75bf594
refactor: query InstantSend via CChainstateHelper in BlockAssembler
knst Aug 12, 2026
d1fca89
fix(coinjoin): decide the pool state from one consistent snapshot
PastaPastaPasta Aug 19, 2026
63f10cb
docs: add instruction to PR template to prevent manual line wrapping
PastaPastaPasta Aug 19, 2026
b2a3c40
fix(wallet): derive Platform keys from descriptor root
PastaPastaPasta Aug 19, 2026
f4e6aa2
test: merge multiple core_write instances to one module for circular …
knst Aug 17, 2026
6c67fc3
refactor: drop unused core_io.h include from evo/smldiff
knst Aug 18, 2026
99464cf
refactor: move RPC help definitions out of core_io module into rpc/
knst Aug 18, 2026
bbeeeb3
refactor: dissolve governance/core_write.cpp into class home files
knst Aug 18, 2026
520a669
refactor: dissolve rpc/evo_util.cpp into rpc/evo.cpp
knst Aug 18, 2026
8e5805e
docs: explain CDeterministicMN::ToJson() placement in rpc/evo.cpp
knst Aug 18, 2026
7c1f653
refactor: absorb netinfo legacy-field helpers into the core_io module
knst Aug 18, 2026
ef7ba7b
fix: add one more splitted module: qt/guiutil + qqt/guiutil_font
knst Aug 19, 2026
6f9a7ad
fix: add one more module merge for circular linter: evo/providertx_util
knst Aug 19, 2026
dd8b9e6
Merge #7581: feat(wallet): add Platform key provider, data records an…
PastaPastaPasta Aug 19, 2026
65b5bb8
refactor: drop the isman reference member from LLMQContext
knst Aug 13, 2026
039b51b
refactor: code-move only: catch_exceptions to the top of the chainsta…
knst Aug 18, 2026
4ee18f5
fix: load CEvoDB and CInstantSendManager safely before chainstate and…
knst Aug 18, 2026
b5b7ab7
refactor: pass CDeterministicMNManager to PeerManager by reference
knst Aug 18, 2026
bba42f0
refactor: pass LLMQContext to PeerManager by reference
knst Aug 18, 2026
b684c2a
refactor: construct CJWalletManager before PeerManager, pass plain po…
knst Aug 18, 2026
6605ed5
Merge #7052: feat: coinjoin promotion / demotion
PastaPastaPasta Aug 19, 2026
fc8d0dd
Merge #7620: fix: circular dependency linter for core_io and related …
PastaPastaPasta Aug 19, 2026
f81c56e
chore: restore alphabetical order in non-backported.txt
knst Aug 18, 2026
4288bb7
refactor(evo): deduplicate provider fee-source fallback cascade
knst Aug 18, 2026
86b1475
fix: correct 'collaterall' and 'anonumous' typos from PR 7600
knst Aug 18, 2026
1bb24f4
refactor(rpc): collapse protx result unwrapping into UnwrapOrThrow()
knst Aug 18, 2026
29e84fe
refactor(rpc): deduplicate protx feeSourceAddress parsing
knst Aug 18, 2026
291a5ba
Merge #7621: refactor: several tiny follow-ups for #7600 merged PR
PastaPastaPasta Aug 19, 2026
bf9f4a4
test(qt): cover transaction type filter persistence and fallback
PastaPastaPasta Aug 13, 2026
93583f2
Merge #7619: docs: add instruction to PR template to prevent manual l…
PastaPastaPasta Aug 20, 2026
1ef87e8
Merge #7603: refactor: move evodb out from chainstate
PastaPastaPasta Aug 20, 2026
bb6e7a0
fix(test): use NodeContext::isman in coinjoin_inouts_tests
PastaPastaPasta Aug 20, 2026
956ec20
Merge #7624: fix(test): use NodeContext::isman in coinjoin_inouts_tests
PastaPastaPasta Aug 20, 2026
cebae5a
feat(qt): add masternode registration and maintenance UI
PastaPastaPasta Aug 19, 2026
297c15b
docs: add masternode management release notes
PastaPastaPasta Aug 19, 2026
4f666b9
fix(miner): validate special tx packages atomically
PastaPastaPasta Aug 10, 2026
109c8f2
docs: add release note for #7570
PastaPastaPasta Aug 10, 2026
90b8a3b
fix(miner): preserve failed package streak
PastaPastaPasta Aug 12, 2026
4886b9f
chore: address review feedback
PastaPastaPasta Aug 19, 2026
5651a05
Merge #7611: test(qt): cover transaction type filter persistence and …
PastaPastaPasta Aug 20, 2026
7be28f8
Merge #7618: feat(qt): add masternode registration and maintenance UI
PastaPastaPasta Aug 21, 2026
1758709
partial Merge bitcoin/bitcoin#33079: ci: limit max stack size to 512 KiB
knst Aug 6, 2026
e357eb1
test: use 4 jobs for asan
knst Aug 21, 2026
117dab2
Merge bitcoin-core/gui#738: Add menu option to migrate a wallet
knst Sep 20, 2023
087c9be
Merge bitcoin/bitcoin#26638: test: prefer sqlite for wallet tests
knst Dec 20, 2022
493f633
fix: follow-up backporting bitcoin#17261 - missing break
knst Apr 9, 2026
56a61c8
Merge bitcoin/bitcoin#26740: wallet: Migrate wallets that are not in …
knst Jun 20, 2023
99a818c
feat: add use_cj feature to RPCs send, sendall and fundrawtransaction
knst Mar 30, 2026
b9f6556
Merge #7354: backport: Merge bitcoin#29144, 28946, 28980, 28554, (par…
PastaPastaPasta Aug 23, 2026
0c0dc15
Merge #7570: fix(mining): validate cumulative special transaction sta…
PastaPastaPasta Aug 23, 2026
e385896
Merge #7519: fix(net): bound QGETDATA request tracking
PastaPastaPasta Aug 23, 2026
bc0f40f
Merge #7633: backport: partial bitcoin#33079 to run more asan jobs at…
PastaPastaPasta Aug 23, 2026
fb26484
Merge #7261: feat: add use_cj feature to RPCs send, sendall and fundr…
PastaPastaPasta Aug 23, 2026
d45a8be
Merge #7277: backport: batch 2 of migratewallet RPC
PastaPastaPasta Aug 23, 2026
c972731
Merge bitcoin/bitcoin#26643: wallet: Move fee underpayment check to a…
knst Dec 13, 2022
cbb7aef
Merge bitcoin/bitcoin#26695: bench: BlockAssembler on a mempool with …
knst Jan 11, 2023
c1e9806
Merge bitcoin/bitcoin#27378: test: Remove python3.5 workaround
knst Apr 2, 2023
f45ee6d
Merge bitcoin/bitcoin#26118: log: Use steady clock for bench logging
knst Oct 10, 2022
78f24fa
Merge bitcoin/bitcoin#26179: bench: Add missed `ECCVerifyHandle` inst…
knst Oct 19, 2022
8239d69
Merge bitcoin/bitcoin#26302: refactor: Use type-safe time point for C…
knst Oct 24, 2022
56ba7c5
Merge bitcoin/bitcoin#26483: test: Don't pass add_to_wallet option to…
knst Nov 10, 2022
1799196
test: remove segwit-based extractor vector from rpc_psbt.json
knst Aug 20, 2026
2aa0e7b
partial Merge bitcoin/bitcoin#25595: Verify PSBT inputs rather than c…
knst Oct 19, 2022
bb61024
Merge bitcoin/bitcoin#26883: src/node/miner cleanups, follow-ups for …
knst Feb 20, 2023
ef68c0c
Merge #7631: backport: bitcoin#26118, #26179, #26302, #26483, #26643,…
PastaPastaPasta Aug 23, 2026
33f8478
fix: bound DMN list/diff caches to stop getmnlistd memory exhaustion
PastaPastaPasta Aug 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

_Provide a general summary of your changes in the Title above_

_Do not manually line wrap text; allow the GitHub UI to dynamically wrap lines._

_Pull requests without a rationale and clear improvement may be closed
immediately._

Expand Down
31 changes: 31 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,37 @@ changes, update the other in the same commit.
code; reserve them for things that genuinely need explaining (non-obvious
invariants, workaround rationale, non-local side effects).

## Assertions and Checks

Full guidance lives in `doc/developer-notes.md` under "Assertions and Checks".
Short version, in order of preference:

- `Assume(cond)` is the default. Use it for "this is how things are supposed to
be": a violation means someone has a bug worth investigating, but execution
stays well-defined. A negative rate-limit counter is the archetype - somebody
decremented twice, we may be more DoS-exposed than intended, but nothing is
corrupt. It aborts in `--enable-debug` and `--enable-fuzz` builds (CI's
`linux64_multiprocess` and fuzz jobs) while a failure is silent in release,
so it must never take down a production node. The expression is always
evaluated.
- `assert(cond)` / `Assert(cond)` is the "we must crash now" case. Use it only
when continuing would be undefined behavior, memory corruption, or corrupt
persisted/consensus state - aborting has to be the safer outcome. It should
be rare and obviously justified, but do use it where it is genuinely needed
to document and enforce a precondition that keeps the code below it safe.
`Assert` returns its argument: `assert(ptr != nullptr); obj = *ptr;` becomes
`obj = *Assert(ptr);`
- `CHECK_NONFATAL(cond)` / `NONFATAL_UNREACHABLE()` for internal logic bugs on
a path with a caller to report to. Required in RPC code, enforced
(best-effort) by `test/lint/lint-assertions.py` for `src/rpc/` and
`src/wallet/rpc*`.

None of these validate input. Data from peers, RPC arguments, wallet files, or
on-disk state must be checked and rejected through normal error handling -
asserting on it turns a peer-triggered inconsistency into a remote crash.
Environment failures (disk full, corrupt block on disk, failed DB write) are
not checks at all: return an error, `AbortNode()`, or `InitError()`.

## Repository Map

- `src/` - C++ implementation.
Expand Down
31 changes: 31 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,37 @@ changes, update the other in the same commit.
code; reserve them for things that genuinely need explaining (non-obvious
invariants, workaround rationale, non-local side effects).

## Assertions and Checks

Full guidance lives in `doc/developer-notes.md` under "Assertions and Checks".
Short version, in order of preference:

- `Assume(cond)` is the default. Use it for "this is how things are supposed to
be": a violation means someone has a bug worth investigating, but execution
stays well-defined. A negative rate-limit counter is the archetype - somebody
decremented twice, we may be more DoS-exposed than intended, but nothing is
corrupt. It aborts in `--enable-debug` and `--enable-fuzz` builds (CI's
`linux64_multiprocess` and fuzz jobs) while a failure is silent in release,
so it must never take down a production node. The expression is always
evaluated.
- `assert(cond)` / `Assert(cond)` is the "we must crash now" case. Use it only
when continuing would be undefined behavior, memory corruption, or corrupt
persisted/consensus state - aborting has to be the safer outcome. It should
be rare and obviously justified, but do use it where it is genuinely needed
to document and enforce a precondition that keeps the code below it safe.
`Assert` returns its argument: `assert(ptr != nullptr); obj = *ptr;` becomes
`obj = *Assert(ptr);`
- `CHECK_NONFATAL(cond)` / `NONFATAL_UNREACHABLE()` for internal logic bugs on
a path with a caller to report to. Required in RPC code, enforced
(best-effort) by `test/lint/lint-assertions.py` for `src/rpc/` and
`src/wallet/rpc*`.

None of these validate input. Data from peers, RPC arguments, wallet files, or
on-disk state must be checked and rejected through normal error handling -
asserting on it turns a peer-triggered inconsistency into a remote crash.
Environment failures (disk full, corrupt block on disk, failed DB write) are
not checks at all: return an error, `AbortNode()`, or `InitError()`.

## Repository Map

- `src/` - C++ implementation.
Expand Down
112 changes: 112 additions & 0 deletions ci/dash/lint-cstyle-casts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
#!/usr/bin/env python3
# Copyright (c) 2026 The Dash Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.

"""Support C-style cast linting in Dash-specific C++ code."""

import argparse
import json
import re
import shlex
import subprocess
import sys
from pathlib import Path
from typing import TextIO


CPP_SOURCE_EXTENSIONS = {".cc", ".cpp", ".cxx"}
DIAGNOSTIC_RE = re.compile(r"^(.*?):\d+:\d+: (?:warning|error): .*")
MACRO_EXPANSION_RE = re.compile(r"^(.*?):\d+:\d+: note: expanded from macro .*")
OLD_STYLE_CAST_DIAGNOSTICS = {"clang-diagnostic-old-style-cast", "google-readability-casting"}


def get_dash_files(source_root: Path) -> list[str]:
manifest = source_root / "test/util/data/non-backported.txt"
patterns = [line.strip() for line in manifest.read_text(encoding="utf8").splitlines() if line.strip()]
result = subprocess.run(
["git", "ls-files", "--", *patterns],
cwd=source_root,
check=True,
stdout=subprocess.PIPE,
text=True,
encoding="utf8",
)
return [line for line in result.stdout.splitlines() if line]


def is_dash_file(path: str, dash_files: set[str]) -> bool:
normalized = path.replace("\\", "/")
return any(normalized == dash_file or normalized.endswith(f"/{dash_file}") for dash_file in dash_files)


def prepare_compile_database(source_root: Path, input_path: Path, output_dir: Path) -> None:
database = json.loads(input_path.read_text(encoding="utf8"))

for entry in database:
if "arguments" not in entry:
entry["arguments"] = shlex.split(entry.pop("command"))
entry["arguments"].extend(["-Wold-style-cast", "-Wno-error=old-style-cast"])

output_dir.mkdir(parents=True, exist_ok=True)
(output_dir / "compile_commands.json").write_text(json.dumps(database), encoding="utf8")


def filter_diagnostics(source_root: Path, input_stream: TextIO, output_stream: TextIO) -> bool:
dash_files = set(get_dash_files(source_root))
group: list[str] = []
found_violation = False

def flush() -> None:
nonlocal found_violation
if not group:
return
diagnostic_match = DIAGNOSTIC_RE.match(group[0])
is_cast_diagnostic = any(diag in group[0] for diag in OLD_STYLE_CAST_DIAGNOSTICS)
macro_expansions = [
expansion_match
for line in group
if (expansion_match := MACRO_EXPANSION_RE.match(line))
]
target_file = macro_expansions[-1].group(1) if macro_expansions else (diagnostic_match.group(1) if diagnostic_match else "")
is_dash_diagnostic = is_dash_file(target_file, dash_files) if target_file else False

if not is_cast_diagnostic or is_dash_diagnostic:
output_stream.writelines(group)
found_violation |= is_cast_diagnostic and is_dash_diagnostic
group.clear()

for line in input_stream:
if DIAGNOSTIC_RE.match(line):
flush()
group.append(line)
elif group:
group.append(line)
else:
output_stream.write(line)
flush()
return found_violation


def main() -> int:
parser = argparse.ArgumentParser(description=__doc__)
subparsers = parser.add_subparsers(dest="command", required=True)

prepare = subparsers.add_parser("prepare", help="create a Dash-aware compilation database")
prepare.add_argument("--input", type=Path, required=True)
prepare.add_argument("--output-dir", type=Path, required=True)
prepare.add_argument("--source-root", type=Path, required=True)

filter_parser = subparsers.add_parser("filter", help="filter clang-tidy diagnostics")
filter_parser.add_argument("--source-root", type=Path, required=True)

args = parser.parse_args()
source_root = args.source_root.resolve()
if args.command == "prepare":
prepare_compile_database(source_root, args.input.resolve(), args.output_dir.resolve())
return 0
return int(filter_diagnostics(source_root, sys.stdin, sys.stdout))


if __name__ == "__main__":
raise SystemExit(main())
16 changes: 14 additions & 2 deletions ci/dash/lint-tidy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,20 @@ python3 "${CLANG_TIDY_CACHE_PY}" --zero-stats 2>&1 || true

cd "${BASE_ROOT_DIR}/build-ci/dashcore-${BUILD_TARGET}/src"

if ! ( run-clang-tidy -clang-tidy-binary="${CLANG_TIDY_CACHE}" -quiet "${MAKEJOBS}" | tee tmp.tidy-out.txt ); then
grep -C5 "error: " tmp.tidy-out.txt
CAST_LINT_DB="${PWD}/../cstyle-cast-compile-db"
python3 "${BASE_ROOT_DIR}/ci/dash/lint-cstyle-casts.py" prepare \
--input "${PWD}/../compile_commands.json" \
--output-dir "${CAST_LINT_DB}" \
--source-root "${BASE_ROOT_DIR}"

if ! ( run-clang-tidy \
-checks=clang-diagnostic-old-style-cast,google-readability-casting \
-clang-tidy-binary="${CLANG_TIDY_CACHE}" \
-p "${CAST_LINT_DB}" \
-quiet "${MAKEJOBS}" | \
python3 "${BASE_ROOT_DIR}/ci/dash/lint-cstyle-casts.py" filter --source-root "${BASE_ROOT_DIR}" | \
tee tmp.tidy-out.txt ); then
grep -E -C5 "error: |warning: use of old-style cast|google-readability-casting" tmp.tidy-out.txt
echo "^^^ ⚠️ Failure generated from clang-tidy"
false
fi
Expand Down
2 changes: 1 addition & 1 deletion ci/dash/matrix.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ source ./ci/test/00_setup_env.sh

# Configure sanitizers options
export ASAN_OPTIONS="detect_leaks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1"
export LSAN_OPTIONS="suppressions=${BASE_ROOT_DIR}/test/sanitizer_suppressions/lsan"
export LSAN_OPTIONS="suppressions=${BASE_ROOT_DIR}/test/sanitizer_suppressions/lsan:print_suppressions=0"
export TSAN_OPTIONS="suppressions=${BASE_ROOT_DIR}/test/sanitizer_suppressions/tsan:halt_on_error=1:second_deadlock_stack=1"
export UBSAN_OPTIONS="suppressions=${BASE_ROOT_DIR}/test/sanitizer_suppressions/ubsan:print_stacktrace=1:halt_on_error=1:report_error_type=1"

Expand Down
5 changes: 5 additions & 0 deletions ci/dash/test_integrationtests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ fi

cd "build-ci/dashcore-$BUILD_TARGET"

if [ -n "${CI_LIMIT_STACK_SIZE}" ]; then
# Upstream uses 512, which segfaults dashd during test framework startup.
ulimit -s 1024
fi

if [ "$SOCKETEVENTS" = "" ]; then
# Let's switch socketevents mode to some random mode
R=$((RANDOM%3))
Expand Down
7 changes: 4 additions & 3 deletions ci/test/00_setup_env_native_asan.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@
export LC_ALL=C.UTF-8

export CONTAINER_NAME=ci_native_asan
export PACKAGES="clang-19 llvm-19 libclang-rt-19-dev python3-zmq qtbase5-dev qttools5-dev-tools libevent-dev bsdmainutils libboost-dev libdb5.3++-dev libminiupnpc-dev libzmq3-dev libqrencode-dev"
export PACKAGES="clang-19 llvm-19 libclang-rt-19-dev python3-zmq qtbase5-dev qttools5-dev-tools libevent-dev bsdmainutils libboost-dev libminiupnpc-dev libzmq3-dev libqrencode-dev"
# Reuses the depends built for the linux64 target, which uses the defaults.
export DEP_OPTS=""
export TEST_RUNNER_EXTRA="--timeout-factor=4 -j2" # Increase timeout because sanitizers slow down
export TEST_RUNNER_EXTRA="--timeout-factor=4 -j4" # Increase timeout because sanitizers slow down
export CI_LIMIT_STACK_SIZE=1
export GOAL="install"
export BITCOIN_CONFIG="--enable-zmq --enable-crash-hooks --with-gui=qt5 \
export BITCOIN_CONFIG="--enable-zmq --enable-crash-hooks --with-gui=qt5 --without-bdb --with-sqlite \
--with-sanitizers=address,float-divide-by-zero,integer,undefined \
CPPFLAGS='-DARENA_DEBUG -DDEBUG_LOCKORDER' \
CC='clang-19 -ftrivial-auto-var-init=pattern' CXX='clang++-19 -ftrivial-auto-var-init=pattern'"
Expand Down
2 changes: 1 addition & 1 deletion ci/test/04_install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ mkdir -p "${CCACHE_DIR}"
mkdir -p "${PREVIOUS_RELEASES_DIR}"

export ASAN_OPTIONS="detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1"
export LSAN_OPTIONS="suppressions=${BASE_BUILD_DIR}/test/sanitizer_suppressions/lsan"
export LSAN_OPTIONS="suppressions=${BASE_BUILD_DIR}/test/sanitizer_suppressions/lsan:print_suppressions=0"
export TSAN_OPTIONS="suppressions=${BASE_BUILD_DIR}/test/sanitizer_suppressions/tsan:halt_on_error=1"
export UBSAN_OPTIONS="suppressions=${BASE_BUILD_DIR}/test/sanitizer_suppressions/ubsan:print_stacktrace=1:halt_on_error=1:report_error_type=1"
env | grep -E '^(BASE_|QEMU_|CCACHE_|LC_ALL|BOOST_TEST_RANDOM|DEBIAN_FRONTEND|CONFIG_SHELL|(ASAN|LSAN|TSAN|UBSAN)_OPTIONS|PREVIOUS_RELEASES_DIR))' | tee /tmp/env
Expand Down
4 changes: 3 additions & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -2077,7 +2077,9 @@ CPPFLAGS="$CPPFLAGS_TEMP"
if test -n "$use_sanitizers"; then
export SECP_CFLAGS="$SECP_CFLAGS $SANITIZER_CFLAGS"
fi
ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-benchmark=no --enable-module-recovery --disable-module-ecdh --disable-openssl-tests"
dnl The ECDH module is required by the wallet's Platform key provider
dnl (DashPay contact request encryption, wallet/platformkeys.cpp).
ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-benchmark=no --enable-module-recovery --enable-module-ecdh --disable-openssl-tests"
AC_CONFIG_SUBDIRS([src/dashbls src/secp256k1])

AC_OUTPUT
Expand Down
4 changes: 4 additions & 0 deletions contrib/devtools/circular-dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
MAPPING = {
'core_read.cpp': 'core_io.cpp',
'core_write.cpp': 'core_io.cpp',
'evo/core_write.cpp': 'core_io.cpp',
'evo/providertx_util.cpp': 'evo/providertx.cpp',
'llmq/core_write.cpp': 'core_io.cpp',
'qt/guiutil_font.cpp': 'qt/guiutil.cpp',
}

# Directories with header-based modules, where the assumption that .cpp files
Expand Down
Loading
Loading