backport: wallet coin selection prerequisites for #7400 - #7479
backport: wallet coin selection prerequisites for #7400#7479thepastaclaw wants to merge 5 commits into
Conversation
b4cf789 to
bc52f0a
Compare
|
✅ Final review complete — no blockers (commit 66d72b4) |
|
CI triage for current head @knst could you rerun the failed job when convenient? No branch change looks warranted from this failure. |
thepastaclaw
left a comment
There was a problem hiding this comment.
Final validation — Codex + Sonnet
The final tree correctly carries the four advertised wallet backports and the Dash-specific CompactSize and BlockInfo adaptations; the omitted upstream legacy watch-only PSBT GUI coverage is an explicit architecture-specific exclusion, while the applicable selected-coin balance behavior is adapted and tested in Dash. No runtime or Dash-subsystem correctness defects remain at the PR head. The only retained finding is commit-stack hygiene: the benchmark is introduced with an uncompilable wallet notification call and repaired three commits later.
Review provenance
- Codex reviewers:
gpt-5.6-sol— general (completed),gpt-5.6-sol— dash-core-commit-history (completed),gpt-5.6-sol— backport-reviewer (completed) - Verifier:
gpt-5.6-sol— final-verifier (fallback) - Sonnet reviewers:
claude-sonnet-5— general (failed),claude-sonnet-5— dash-core-commit-history (failed),claude-sonnet-5— backport-reviewer (completed),claude-sonnet-5— general (completed),claude-sonnet-5— dash-core-commit-history (completed)
🟡 1 suggestion(s)
🤖 Prompt for all review comments with AI agents
These findings are from an automated code review. Verify each finding against the current code and only fix it if needed.
In `src/bench/wallet_create_tx.cpp`:
- [SUGGESTION] src/bench/wallet_create_tx.cpp:73: bench target does not compile for three intermediate commits (fixed by final commit in this same PR)
Commit `c392040ca08` registers this new source in `bench_bench_dash_SOURCES` but calls `wallet.blockConnected(block, pindex->nHeight)`. At that commit, `CWallet` declares only `blockConnected(const interfaces::BlockInfo&)`, so a wallet-enabled benchmark build fails at `c392040ca08` and remains broken through `0969ce0fe7e` and `cde726cc5e1`. The final commit correctly changes the call to `kernel::MakeBlockInfo`, but Dash preserves commits when merging, so fold that adaptation into `c392040ca08` or place it immediately afterward to keep the permanent history independently buildable and bisectable.
|
I've resolved each script finding against the actual PR head tree, base, and commit chain. Here's the review. Backport review: #7479 —
|
bc52f0a to
a8c5f71
Compare
|
This pull request has conflicts, please rebase. |
|
Thanks for the careful review. Addressed in the rewritten branch at 1. Undeclared partial bitcoin#26699
2. Intermediate commits not buildable 3. Watch-only PSBT test 4. Minor GUI refactors Old head |
|
This pull request has conflicts, please rebase. |
4fef534 wallet: use GetChange() when computing waste (S3RK) 87e0ef9 wallet: use GetChange() in tx building (S3RK) 15e97a6 wallet: add SelectionResult::GetChange (S3RK) 72cad28 wallet: calculate and store min_viable_change (S3RK) e3210a7 wallet: account for preselected inputs in target (S3RK) f8e7963 wallet: add SelectionResult::Merge (S3RK) 06f558e wallet: accurate SelectionResult::m_target (S3RK) c8cf08e wallet: ensure m_min_change_target always covers change fee (S3RK) Pull request description: Benefits: 1. more accurate waste calculation for knapsack. Waste calculation is now consistent with tx building code. Before we always assumed change for knapsack even when the solution is changeless4. 2. simpler tx building code. Only create change output when it's needed 3. makes it easier to correctly account for fees for CPFP inputs (should be done in a follow up) In the first three commits we fix the code to accurately track selection target in `SelectionResult::m_target` Then we introduce new variable `min_change` that represents the minimum viable change amount Then we introduce `SelectionResult::GetChange()` which incapsulates dropping change for fee logic and uses correct values of `SelectionResult::m_target` Then we use `SelectionResult::GetChange()` in both tx building and waste calculation code This PR is a refactoring and shouldn't change the behaviour. There is only one known small change (arguably a bug fix). Before we dropped change output if it's smaller than `cost_of_change` after paying change fees. This is incorrect as `cost_of_change` already includes `change_fee`. ACKs for top commit: achow101: ACK 4fef534 Xekyo: crACK 4fef534 furszy: Code review ACK 4fef534 w0xlt: ACK bitcoin@4fef534 Tree-SHA512: 31a7455d4129bc39a444da0f16ad478d690d4d9627b2b8fdb5605facc6488171926bf02f5d7d9a545b2b59efafcf5bb3d404005e4da15c7b44b3f7d441afb941 (cherry picked from commit 2bd9aa5)
…g target d0d9cf7 test: Check external coin effective value is used in CoinSelection (Aurèle Oulès) 76b79c1 wallet: Use correct effective value when checking target (Aurèle Oulès) Pull request description: Fixes bitcoin#26185. The following assert failed because it was not checked in the parent function. https://github.com/bitcoin/bitcoin/blob/2bd9aa5a44b88c866c4d98f8a7bf7154049cba31/src/wallet/coinselection.cpp#L391 ACKs for top commit: glozow: reACK d0d9cf7 furszy: ACK d0d9cf7 Tree-SHA512: e126daba1115e9d143f2a582c6953e7ea55e96853b6e819c7744fd7a23668f7d9854681d43ef55d8774655bc54e7e87c1c9fccd746d9e30fbf3caa82ef808ae9 (cherry picked from commit cda6c79)
a8c5f71 to
182745c
Compare
|
Thanks — I addressed all four findings and force-pushed the corrected series at 1. Undeclared partial bitcoin#26699 The commit is now 2. Intermediate buildability The 3. Watch-only PSBT coverage Added an adapted 4. Minor GUI pieces Included I also rebased the rewritten five-commit series onto current Validation at
Rerunning exact-head backport verification now. |
thepastaclaw
left a comment
There was a problem hiding this comment.
Final validation — Codex + Sonnet
All three specialist lanes (general, dash-core-commit-history, backport-reviewer) report zero findings at head 182745c, and independent verification confirms the sole prior finding is genuinely fixed: commit f09f7d7 now both registers src/bench/wallet_create_tx.cpp in bench_bench_dash_SOURCES and calls wallet.blockConnected(kernel::MakeBlockInfo(pindex, &block)) at that same commit, matching CWallet's single-argument blockConnected(const interfaces::BlockInfo&) signature — verified directly via git show f09f7d71b7c:src/bench/wallet_create_tx.cpp and git show f09f7d71b7c:src/wallet/wallet.h. No new defects were introduced by the rebase/rewrite, and the five-commit stack (four faithful Bitcoin Core wallet backports plus one well-documented Dash CompactSize adaptation) is clean, bisectable, and independently buildable at every commit.
Source: reviewer backend model gpt-5.6-sol (Codex general, dash-core-commit-history, backport-reviewer) and claude-sonnet-5 (Sonnet general, dash-core-commit-history, backport-reviewer); final verifier backend model claude-sonnet-5. openclaw-agent/cliproxy/gpt-5.6-sol is orchestration-only and is not reviewer evidence.
Review provenance
- Codex reviewers:
gpt-5.6-sol— general (completed),gpt-5.6-sol— dash-core-commit-history (completed),gpt-5.6-sol— backport-reviewer (completed) - Verifier:
claude-sonnet-5— final-verifier - Sonnet reviewers:
claude-sonnet-5— general (completed),claude-sonnet-5— dash-core-commit-history (completed),claude-sonnet-5— backport-reviewer (completed)
Canonical verifier result: APPROVE. GitHub does not allow authors to approve or request changes on their own pull requests, so this review was submitted using COMMENT transport. The findings and blocker status above are unchanged.
|
CI triage for current head All Qt tests pass, after which LeakSanitizer reports 86 bytes in four allocations from Qt's Tracked the pre-existing ASan/Qt DBus failure in #7561. Per the unrelated-CI guardrail, no commit, push, rebase, or rerun was performed on this PR branch. |
…pre-set-inputs fetching responsibility from Coin Selection 3fcb545 bench: benchmark transaction creation process (furszy) a8a7534 wallet: SelectCoins, return early if target is covered by preset-inputs (furszy) f41712a wallet: simplify preset inputs selection target check (furszy) 5baedc3 wallet: remove fetch pre-selected-inputs responsibility from SelectCoins (furszy) 295852f wallet: encapsulate pre-selected-inputs lookup into its own function (furszy) 37e7887 wallet: skip manually selected coins from 'AvailableCoins' result (furszy) 94c0766 wallet: skip available coins fetch if "other inputs" are disallowed (furszy) Dash adaptations (folded for bisectability, so this commit builds on its own without a follow-up adaptation commit): - bench/wallet_create_tx.cpp: Dash's CWallet constructor takes a CoinJoin loader, SetupDescriptorScriptPubKeyMans() takes mnemonic and mnemonic passphrase arguments, and CreateTransaction() takes wallet::RANDOM_CHANGE_POSITION rather than a bare -1. - bench/wallet_create_tx.cpp and test/util/wallet.{h,cpp}: Dash only supports OutputType::LEGACY, so getNewDestination() takes no output type and the benchmark drops upstream's output_type parameter. - bench/wallet_create_tx.cpp: Dash's BlockManager::AddToBlockIndex() takes the block hash as an explicit argument. - bench/wallet_create_tx.cpp: Dash's CoinsResult exposes legacy/other vectors instead of a map keyed by OutputType, so the pre-selected inputs are read from res.legacy rather than res.coins.at(output_type). - wallet/spend.cpp: TrimPreSelectedInputs() keeps Dash's CCoinControl::fRequireAllInputs=false behaviour, which upstream does not have, working on top of the new "return early when the preset inputs already cover the target" path. The trimmed subset is now walked in PreSelectedInputs::coins order (std::set<COutput>, ordered by outpoint) instead of the previous AvailableCoins order. The invariant is unchanged: the trimmed set still covers the target, and it is only ever computed on a preset set that already covers it. Which particular subset is chosen may differ, so coinselector_tests' Dash-specific minimum_inputs_test now asserts the input count and that the target is covered, rather than one exact selected value. - rpc/evo.cpp: upstream flips the CCoinControl::m_allow_other_inputs default from false to true, so FundSpecialTx() now sets it to false explicitly to keep funding restricted to the requested address. Upstream makes the equivalent adjustment for the Qt send dialog. Pull request description: #### # Context (Current Flow on Master) In the transaction creation process, in order to select which coins the new transaction will spend, we first obtain all the available coins known by the wallet, which means walking-through the wallet txes map, gathering the ones that fulfill certain spendability requirements in a vector. This coins vector is then provided to the Coin Selection process, which first checks if the user has manually selected any input (which could be internal, aka known by the wallet, or external), and if it does, it fetches them by searching each of them inside the wallet and/or inside the Coin Control external tx data. Then, after finding the pre-selected-inputs and gathering them in a vector, the Coin Selection process walks-through the entire available coins vector once more just to erase coins that are in both vectors. So the Coin Selection process doesn’t pick them twice (duplicate inputs inside the same transaction). #### # Process Workflow Changes Now, a new method, `FetchCoins` will be responsible for: 1) Lookup the user pre-selected-inputs (which can be internal or external). 2) And, fetch the available coins in the wallet (excluding the already fetched ones). Which will occur prior to the Coin Selection process. Which allows us to never include the pre-selected-inputs inside the available coins vector in the first place, as well as doing other nice improvements (written below). So, Coin Selection can perform its main responsibility without mixing it with having to fetch internal/external coins nor any slow and unneeded duplicate coins verification. #### # Summarizing the Improvements: 1) If any pre-selected-input lookup fail, the process will return the error right away. 2) The pre-selected-inputs lookup failure causes are properly described on the return error. 3) Faster Coin Selection: no longer need to remove the pre-set inputs from the available coins vector. 4) Faster transaction creation for transactions that only use manually selected inputs. ACKs for top commit: S3RK: Code Review ACK 3fcb545 achow101: ACK 3fcb545 aureleoules: reACK 3fcb545 Tree-SHA512: 42f833e92f40c348007ca565a4c98039e6f1ff25d8322bc2b27115824744779baf0b0a38452e4e2cdcba45076473f1028079bbd0f670020481ec5d3db42e4731 (cherry picked from commit f37bd15)
… skips selected coins Included upstream commits (adapted to Dash): dc1cc1c gui: bugfix, getAvailableBalance skips selected coins (furszy) 74eac3a test: add coverage for 'useAvailableBalance' functionality (furszy) 2f76ac0 test,gui: decouple chain and wallet initialization from test case (furszy) 306aab5 test,gui: decouple widgets and model into a MiniGui struct (furszy) 68eed5d test,gui: add coverage for PSBT creation on legacy watch-only wallets (furszy) BACKPORT NOTE (partial): Intentionally omitted: cd98b71 gui: 'getAvailableBalance', include watch only balance Why omitted: Upstream bitcoin#26687 fixed WalletModel::getAvailableBalance so the cached-balance path (from bitcoin-core/gui#598) also adds watch_only_balance when private keys are disabled. Dash never landed that WalletModel::getAvailableBalance cached path. prepareTransaction and useAvailableBalance both call wallet().getAvailableBalance(coin_control) after updateCoinControlState / useAvailableBalance set fAllowWatchOnly for private-keys-disabled wallets. AvailableCoins already includes solvable watch-only outputs under that flag, and SendCoinsDialog::setBalance already displays watch_only_balance for legacy private-keys-disabled wallets. Porting cd98b71 would require introducing the model-level cache API just to re-express behavior Dash already has on the wallet-interface path; that is out of scope for this prerequisite batch. Included with Dash adaptations: - Core bugfix: interfaces::Wallet::getAvailableBalance sums selected inputs via FetchSelectedInputs and optional AvailableCoins when other inputs are allowed (regression from bitcoin#25685). - useAvailableBalance coverage via VerifyUseAvailableBalance. - presentPSBT QMessageBox parented to the dialog (msgBox(this)). - ConfirmSend accepts QMessageBox::StandardButton so "Create Unsigned" (Save) can be driven from tests. - Adapted legacy watch-only PSBT GUI test (TestGUIWatchOnly): constructs a private-keys-disabled legacy wallet with ImportPubKeys, asserts the send dialog shows watch_only_balance, clicks Create Unsigned, and decodes the clipboard PSBT. Dash CWallet requires the CoinJoin loader; no PlatformStyle constructors; DecodeBase64PSBT used for decoding. MiniGUI was not ported wholesale because Dash SendCoinsDialog/TransactionView/WalletModel constructors differ; SyncUpWallet + SetupLegacyWatchOnlyWallet helpers provide the same separation of concerns. Pull request description: Fixes bitcoin-core/gui#688 and bitcoin#26687. First Issue Description (bitcoin-core/gui#688): The previous behavior for getAvailableBalance, when the coin control had selected coins, was to return the sum of them. Instead, we are currently returning the wallet's available total balance minus the selected coins total amount. Reason: Missed to update the GetAvailableBalance function to include the coin control selected coins on bitcoin#25685. Context: Since bitcoin#25685 we skip the selected coins inside AvailableCoins. Places Where This Generates Issues (only when the user manually select coins via coin control): 1) The GUI balance check prior the transaction creation process. 2) The GUI "useAvailableBalance" functionality. Second Issue Description (bitcoin#26687): Upstream fixed WalletModel cached getAvailableBalance for watch-only. Dash does not use that path; see BACKPORT NOTE above. ACKs for top commit: Sjors: tACK 68eed5d achow101: ACK 68eed5d theStack: ACK 68eed5d Tree-SHA512: 674f3e050024dabda2ff4a04b9ed3750cf54a040527204c920e1e38bd3d7f5fd4d096e4fd08a0fea84ee6abb5070f022b5c0d450c58fd30202ef05ebfd7af6d3 (cherry picked from commit 27dcc07)
…ing) Dash-specific follow-up to the bitcoin#25647 backport. Coin selection estimates CompactSize prefixes before the final input and output counts are known. Wider vin-count prefixes at 253 or 65,536 inputs, or a wider vout-count prefix when change raises 252 or 65,535 recipients across a boundary, can leave the selected value a few duffs short of the accurately measured final fee. After selecting inputs, recompute the non-input fee with the actual vin-count prefix and the prospective change output count, then retry selection if the target must increase. This keeps change-bearing and exact no-change transactions on the same path and preserves the final Fee needed > fee paid check for unrelated accounting defects. Add regression coverage for 252 inputs, 253 inputs with change, an exact-target 253-input transaction without change, and 252 recipients plus change.
182745c to
66d72b4
Compare
thepastaclaw
left a comment
There was a problem hiding this comment.
Final validation — Codex + Sonnet
This delta (182745c..66d72b4) contains exactly two one-line changes: a correct EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet) annotation restored on FetchSelectedInputs's definition in spend.cpp (matches the header declaration and the sole caller, which already holds cs_wallet), and a benchmark comment edit changing 'minus 100 due COINBASE_MATURITY' to 'minus 200 due COINBASE_MATURITY' in wallet_create_tx.cpp. I verified against bitcoin/bitcoin@f37bd15 that upstream's own merged text says 'minus 200' despite upstream's own COINBASE_MATURITY also being 100 — this is a pre-existing upstream Bitcoin Core comment inaccuracy carried over verbatim, not a Dash-introduced error, so per the backport review policy against re-reviewing/flagging upstream text it is dropped. No in-scope findings remain; the PR is clean and mergeable.
Source: reviewer backend model gpt-5.6-sol (Codex general, dash-core-commit-history, backport-reviewer) and claude-sonnet-5 (Sonnet general, dash-core-commit-history, backport-reviewer); final verifier backend model claude-sonnet-5. openclaw-agent/cliproxy/gpt-5.6-sol is orchestration-only and is not reviewer evidence.
Review provenance
- Codex reviewers:
gpt-5.6-sol— general (completed),gpt-5.6-sol— dash-core-commit-history (completed),gpt-5.6-sol— backport-reviewer (completed) - Verifier:
claude-sonnet-5— final-verifier - Sonnet reviewers:
claude-sonnet-5— general (completed),claude-sonnet-5— dash-core-commit-history (completed),claude-sonnet-5— backport-reviewer (completed)
Canonical verifier result: APPROVE. GitHub does not allow authors to approve or request changes on their own pull requests, so this review was submitted using COMMENT transport. The findings and blocker status above are unchanged.
|
CI triage for current head All Qt tests pass, then LeakSanitizer reports 86 bytes in four allocations from Qt's The pre-existing Qt/DBus LSAN failure remains tracked in #7561. Per the unrelated-CI guardrail, no commit, push, rebase, or rerun was performed on this branch. |
Issue being fixed or feature implemented
Dash PR #7400 currently combines its target wallet changes with a longer Bitcoin Core prerequisite chain. This extracts the first independently mergeable prerequisite batch so the backports can be reviewed and landed in smaller units.
This branch was rebased onto
upstream/developate25f9925df4f0bafaf5f6d13ac34e14bdc8eecc9(pre-rebase backuprefs/heads/backup/pr7479-pre-develop-rebase-a8c5f714; pre-provenance-fix backuprefs/heads/backup/7479-pre-provenance-fixes-182745cf). It contains four logical Bitcoin Core backports plus one Dash CompactSize adaptation, within the requested limit of at most five commits per prerequisite PR. It does not modify or replace #7400; that PR must remain unchanged until the prerequisite PRs merge.What was done?
Backported:
SelectionResultbitcoin#26699 intentionally travels with bitcoin#25685 because omitting it makes manual coin-control balance checks exclude the selected coins.
Partial backport: bitcoin#26699
Subject form:
partial Merge bitcoin/bitcoin#26699(Dash convention).Included (adapted to Dash):
dc1cc1c3599getAvailableBalanceincludes selected coins after bitcoin#2568574eac3a82fcuseAvailableBalancecoverage2f76ac03839/306aab5bb4768eed5df865QMessageBox(this); ConfirmSendStandardButton; legacy watch-only PSBT GUI testIntentionally omitted:
cd98b717398gui:getAvailableBalance, include watch-only balanceWalletModel::getAvailableBalanceso the cached-balance path from bitcoin-core/gui#598 addswatch_only_balancewhen private keys are disabled. Dash never landed thatWalletModel::getAvailableBalanceAPI.prepareTransactionanduseAvailableBalanceboth callwallet().getAvailableBalance(coin_control)afterfAllowWatchOnlyis set for private-keys-disabled wallets;AvailableCoinsalready includes solvable watch-only outputs under that flag;SendCoinsDialog::setBalancealready showswatch_only_balancefor legacy private-keys-disabled wallets. Portingcd98b717would require introducing the model-level cache API only to re-express behavior Dash already has on the wallet-interface path — out of scope for this prerequisite batch. Still valid on current develop.Watch-only PSBT test:
An adapted
TestGUIWatchOnlyis included. It builds a private-keys-disabled legacy wallet viaImportPubKeys, asserts the send dialog displayswatch_only_balance, drives Create Unsigned (QMessageBox::Save), and decodes the clipboard PSBT withDecodeBase64PSBT. Dash adaptations:CWalletrequires the CoinJoin loader; noPlatformStyleconstructors; no full MiniGUI port.After rebase onto develop,
src/qt/test/wallettests.cppalso retains develop’s CoinJoin autobackup-failure tooltip regression coverage (nWalletBackups0/-1/-2) from #7479’s new base; both includes (util/strencodings.h+util/system.h) are kept.Dash-specific adaptations
FundSpecialTxselected-input handling inrpc/evo.cpp(m_allow_other_inputs = false).AddToBlockIndexargument,CoinsResult::legacylayout, andwallet::RANDOM_CHANGE_POSITION. Upstream already usedkernel::MakeBlockInfo(pindex, &block); that line is unchanged.CCoinControl::fRequireAllInputs=falsebehavior withTrimPreSelectedInputs. Before this backport the subset was accumulated inAvailableCoins/wallet order; it is now accumulated fromPreSelectedInputs::coins, astd::set<COutput>ordered by outpoint. The particular sufficient subset may therefore change, while the preserved invariant is that it still covers the target. The sole production caller using this mode isFundSpecialTx.#25685still flipsCCoinControl::m_allow_other_inputsdefault from develop’sfalse(wallet: unify “allow/block other inputs“ concept bitcoin/bitcoin#25118) totrue(upstream wallet: Faster transaction creation by removing pre-set-inputs fetching responsibility from Coin Selection bitcoin/bitcoin#25685). Field already existed on develop; default change is intentional and retained.Commit map (post develop rebase)
512571f3597b1a545f183d7ca4e430d2b2ffd8e5219466d72b4aa17Old→new (pre-rebase review-rewrite head → current post-rebase/review-reconciliation head):
56439297b8f→512571f3597db880c91dd3→b1a545f183d126566523f8→7ca4e430d2bd0b79b12c0f→2ffd8e52194a8c5f714bab→66d72b4aa17Later sequencing, after this PR merges:
descriptorprocesspsbtrpc bitcoin/bitcoin#25796, IntroduceMockableDatabasefor wallet unit tests bitcoin/bitcoin#26715, walletdb: Remove unused CreateMockWalletDatabase bitcoin/bitcoin#27665, and wallet, bench: Move commonly used functions to their own file and fix a bug bitcoin/bitcoin#27666.No later prerequisite PR has been opened yet.
How Has This Been Tested?
Tested on macOS arm64 using the repository's autotools build configured against the existing Dash depends prefix.
Build targets at final head
66d72b4aa17:test/test_dashbench/bench_dashqt/test/test_dash-qtCommit-level buildability:
7ca4e430d2b),make -C src bench/bench_dash test/test_dashsucceeded. The benchmark'skernel::MakeBlockInfocall matches upstream; the folded changes are the documented Dash API and selected-input adaptations.Unit and benchmark coverage at final head (rerun after review reconciliation):
./src/test/test_dash --run_test=coinselector_tests,spend_tests,wallet_tests— 34 test cases, no errors./src/bench/bench_dash -filter='WalletCreateTx.*'— bothWalletCreateTxUseOnlyPresetInputsandWalletCreateTxUsePresetInputsAndCoinSelectionran successfullyQt:
./src/qt/test/test_dash-qt -platform minimal— all suites passed; on macOSminimal,WalletTests/AddressBookTests/AppTestsbodies skip due to known Qt cocoa/minimallimitations (pre-existing). The newTestGUIWatchOnlyis under that same guard and is intended to run on Linux CI / non-minimal platforms.Additional checks:
git diff --checkclean one25f9925df4..HEADgit verify-commitGood signature from thepastaclaw)git merge-tree --write-tree --name-only HEAD upstream/developclean after rebasesrc/qt/test/wallettests.cppkeeps develop CoinJoin tooltip coverage and the adapted watch-only Create Unsigned/clipboard PSBT pathBreaking Changes
None.
Checklist: