forked from bitcoin/bitcoin
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
backport: Merge bitcoin#26053, 28230, 28500 #7256
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 1 commit
Commits
Show all changes
3 commits
Select commit
Hold shift + click to select a range
bcf55ba
Merge bitcoin/bitcoin#26053: rpc: bugfix, 'add_inputs' default value …
achow101 3fe49c9
Merge bitcoin/bitcoin#28230: rpc: Add MaybeArg() and Arg() default he…
fanquake e6df404
Merge bitcoin/bitcoin#28500: Prevent default/invalid CKey objects fro…
fanquake File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -103,6 +103,7 @@ def run_test(self): | |
| self.generate(self.nodes[2], 1) | ||
| self.generate(self.nodes[0], 121) | ||
|
|
||
| self.test_add_inputs_default_value() | ||
| self.test_change_position() | ||
| self.test_simple() | ||
| self.test_simple_two_coins() | ||
|
|
@@ -1021,6 +1022,120 @@ def test_external_inputs(self): | |
|
|
||
| self.nodes[2].unloadwallet("extfund") | ||
|
|
||
| def test_add_inputs_default_value(self): | ||
| self.log.info("Test 'add_inputs' default value") | ||
|
|
||
| # Create and fund the wallet with 5 BTC | ||
| self.nodes[2].createwallet("test_preset_inputs") | ||
| wallet = self.nodes[2].get_wallet_rpc("test_preset_inputs") | ||
| addr1 = wallet.getnewaddress() | ||
| self.nodes[0].sendtoaddress(addr1, 5) | ||
| self.generate(self.nodes[0], 1) | ||
|
|
||
| # Covered cases: | ||
| # 1. Default add_inputs value with no preset inputs (add_inputs=true): | ||
| # Expect: automatically add coins from the wallet to the tx. | ||
| # 2. Default add_inputs value with preset inputs (add_inputs=false): | ||
| # Expect: disallow automatic coin selection. | ||
| # 3. Explicit add_inputs=true and preset inputs (with preset inputs not-covering the target amount). | ||
| # Expect: include inputs from the wallet. | ||
| # 4. Explicit add_inputs=true and preset inputs (with preset inputs covering the target amount). | ||
| # Expect: only preset inputs are used. | ||
| # 5. Explicit add_inputs=true, no preset inputs (same as (1) but with an explicit set): | ||
| # Expect: include inputs from the wallet. | ||
|
|
||
| # Case (1), 'send' command | ||
| # 'add_inputs' value is true unless "inputs" are specified, in such case, add_inputs=false. | ||
| # So, the wallet will automatically select coins and create the transaction if only the outputs are provided. | ||
| tx = wallet.send(outputs=[{addr1: 3}]) | ||
| assert tx["complete"] | ||
|
|
||
| # Case (2), 'send' command | ||
| # Select an input manually, which doesn't cover the entire output amount and | ||
| # verify that the dynamically set 'add_inputs=false' value works. | ||
|
|
||
| # Fund wallet with 2 outputs, 5 BTC each. | ||
| addr2 = wallet.getnewaddress() | ||
| source_tx = self.nodes[0].send(outputs=[{addr1: 5}, {addr2: 5}], options={"change_position": 0}) | ||
| self.generate(self.nodes[0], 1) | ||
|
|
||
| # Select only one input. | ||
| options = { | ||
| "inputs": [ | ||
| { | ||
| "txid": source_tx["txid"], | ||
| "vout": 1 # change position was hardcoded to index 0 | ||
| } | ||
| ] | ||
| } | ||
| assert_raises_rpc_error(-4, "Insufficient funds", wallet.send, outputs=[{addr1: 8}], options=options) | ||
|
|
||
| # Case (3), Explicit add_inputs=true and preset inputs (with preset inputs not-covering the target amount) | ||
| options["add_inputs"] = True | ||
| options["add_to_wallet"] = False | ||
| tx = wallet.send(outputs=[{addr1: 8}], options=options) | ||
| assert tx["complete"] | ||
|
|
||
| # Case (4), Explicit add_inputs=true and preset inputs (with preset inputs covering the target amount) | ||
| options["inputs"].append({ | ||
| "txid": source_tx["txid"], | ||
| "vout": 2 # change position was hardcoded to index 0 | ||
| }) | ||
| tx = wallet.send(outputs=[{addr1: 8}], options=options) | ||
| assert tx["complete"] | ||
| # Check that only the preset inputs were added to the tx | ||
| decoded_psbt_inputs = self.nodes[0].decodepsbt(tx["psbt"])['tx']['vin'] | ||
| assert_equal(len(decoded_psbt_inputs), 2) | ||
| for input in decoded_psbt_inputs: | ||
| assert_equal(input["txid"], source_tx["txid"]) | ||
|
|
||
| # Case (5), assert that inputs are added to the tx by explicitly setting add_inputs=true | ||
| options = {"add_inputs": True, "add_to_wallet": True} | ||
| tx = wallet.send(outputs=[{addr1: 8}], options=options) | ||
| assert tx["complete"] | ||
|
|
||
| ################################################ | ||
|
|
||
| # Case (1), 'walletcreatefundedpsbt' command | ||
| # Default add_inputs value with no preset inputs (add_inputs=true) | ||
| inputs = [] | ||
| outputs = {self.nodes[1].getnewaddress(): 8} | ||
| assert "psbt" in wallet.walletcreatefundedpsbt(inputs=inputs, outputs=outputs) | ||
|
|
||
| # Case (2), 'walletcreatefundedpsbt' command | ||
| # Default add_inputs value with preset inputs (add_inputs=false). | ||
| inputs = [{ | ||
| "txid": source_tx["txid"], | ||
| "vout": 1 # change position was hardcoded to index 0 | ||
| }] | ||
| outputs = {self.nodes[1].getnewaddress(): 8} | ||
| assert_raises_rpc_error(-4, "Insufficient funds", wallet.walletcreatefundedpsbt, inputs=inputs, outputs=outputs) | ||
|
|
||
| # Case (3), Explicit add_inputs=true and preset inputs (with preset inputs not-covering the target amount) | ||
| options["add_inputs"] = True | ||
| options["add_to_wallet"] = False | ||
| assert "psbt" in wallet.walletcreatefundedpsbt(outputs=[{addr1: 8}], inputs=inputs, options=options) | ||
|
|
||
| # Case (4), Explicit add_inputs=true and preset inputs (with preset inputs covering the target amount) | ||
| inputs.append({ | ||
| "txid": source_tx["txid"], | ||
| "vout": 2 # change position was hardcoded to index 0 | ||
| }) | ||
| psbt_tx = wallet.walletcreatefundedpsbt(outputs=[{addr1: 8}], inputs=inputs, options=options) | ||
| # Check that only the preset inputs were added to the tx | ||
| decoded_psbt_inputs = self.nodes[0].decodepsbt(psbt_tx["psbt"])['tx']['vin'] | ||
| assert_equal(len(decoded_psbt_inputs), 2) | ||
| for input in decoded_psbt_inputs: | ||
| assert_equal(input["txid"], source_tx["txid"]) | ||
|
|
||
| # Case (5), 'walletcreatefundedpsbt' command | ||
| # Explicit add_inputs=true, no preset inputs | ||
| options = { | ||
| "add_inputs": True | ||
| } | ||
| assert "psbt" in wallet.walletcreatefundedpsbt(inputs=[], outputs=outputs, options=options) | ||
|
|
||
| self.nodes[2].unloadwallet("test_preset_inputs") | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 26053: nit: missing \n before |
||
| def test_include_unsafe(self): | ||
| self.log.info("Test fundrawtxn with unsafe inputs") | ||
|
|
||
|
|
||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
Repository: dashpay/dash
Length of output: 1769
🏁 Script executed:
Repository: dashpay/dash
Length of output: 1445
Fix Ruff A001: avoid shadowing builtin
input.Lines 1089 and 1128 use
inputas a loop variable, which shadows Python's builtininput()function and triggers Ruff A001 linting violations.Proposed rename
This applies to both occurrences at lines 1089 and 1128.
📝 Committable suggestion
🧰 Tools
🪛 Ruff (0.15.9)
[error] 1089-1089: Variable
inputis shadowing a Python builtin(A001)
🤖 Prompt for AI Agents