Skip to content

wallet: RBF batch payments manager - #9298

Merged
ecdsa merged 1 commit into
masterfrom
batch_payments_manager
Mar 13, 2025
Merged

wallet: RBF batch payments manager#9298
ecdsa merged 1 commit into
masterfrom
batch_payments_manager

Conversation

@ecdsa

@ecdsaecdsa commented Nov 12, 2024

Copy link
Copy Markdown
Member

note: this is not "reorg safe", meaning that there is no guarantee that all payments will end up in in the blockchain.
However, I believe this is "double send safe", meaning that we will never send a payment twice.

@ecdsa
ecdsa marked this pull request as ready for review November 12, 2024 10:20
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from b71b11f to 45c7543CompareNovember 14, 2024 09:21
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from a48e7ca to 5c7a247CompareDecember 4, 2024 10:34
@ecdsaecdsa added this to the 4.6.0 milestone Dec 4, 2024
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from 3bdbf87 to 3ad4406CompareDecember 10, 2024 09:24
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9691a83 to 7a40399CompareJanuary 16, 2025 08:52
@ecdsa
ecdsa marked this pull request as draft January 16, 2025 13:21
@spesmilospesmilo deleted a comment Jan 27, 2025
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 14 times, most recently from 4826f7e to 5fd2ec7CompareFebruary 16, 2025 10:10
@f321x

Copy link
Copy Markdown
Member

I get this exception and electrum crashes when batching is enabled and trying to fully spend an unconfirmed utxo from the "Coins" tab with right click -> fully spend -> send to address in clipboard.

Traceback (most recent call last):
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 116, in timer_actions
self.update()
~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 120, in update
self.update_tx()
~~~~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 641, in update_tx
self.tx = self.make_tx(fee_estimator, confirmed_only=confirmed_only)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/gui/qt/send_tab.py", line 320, in <lambda>
make_tx = lambda fee_est, *, confirmed_only=False: self.wallet.make_unsigned_transaction(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
coins=get_coins(nonlocal_only=nonlocal_only, confirmed_only=confirmed_only),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
outputs=outputs,
^^^^^^^^^^^^^^^^
fee=fee_est,
^^^^^^^^^^^^
is_sweep=is_sweep)
^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/util.py", line 492, in do_profile
o = func(*args, **kw_args)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1774, in get_unconfirmed_base_tx_for_batching
output_amount = sum(o.value for o in outputs)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9daa851 to 3f8bc37CompareFebruary 20, 2025 17:49
@ecdsa

Copy link
Copy Markdown
MemberAuthor

File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)

This does not correspond to the code in the batch_payment_manager branch.
get_unconfirmed_base_tx_for_batching is not used anymore (and should probably be removed)

@f321x

Copy link
Copy Markdown
Member

Can confirm it doesn't happen on this branch, only on master.

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 2 times, most recently from 1b9218c to be6f9bbCompareFebruary 21, 2025 11:43
Comment threadelectrum/txbatcher.py Outdated
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9f589b0 to ccb0cc3CompareFebruary 23, 2025 09:10
@ecdsa

Copy link
Copy Markdown
MemberAuthor

Note: This PR does not work well with fee settings.

When we change the fee settings in ConfirmTxDialog, this side effects the fee settings in config, which is in turn used by TxBatcher. I think we should use a FeeEstimator object that holds fee settings and provides fee estimates, without committing the settings to config.

SomberNight
SomberNight previously requested changes Feb 25, 2025
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/lnwatcher.py Outdated
Comment threadelectrum/wallet.py
The class TxBatcher handles the creation, broadcast and replacement
of replaceable transactions. Callers (LNWatcher, SwapManager) use
methods add_payment_output and add_sweep_info. Transactions
created by TxBatcher may combine sweeps and outgoing payments.
Transactions created by TxBatcher will have their fee bumped
automatically (this was only the case for sweeps before).
TxBatcher manages several TxBatches. TxBatches are created
dynamically when needed.
The GUI does not touch txbatcher transactions:
- wallet.get_candidates_for_batching excludes txbatcher
transactions
- RBF dialogs do not work with txbatcher transactions
wallet:
- instead of reading config variables, make_unsigned_transaction
takes new parameters: base_tx, send_change_to_lighting
tests:
- unit tests in test_txbatcher.py (replaces test_sswaps.py)
- force all regtests to use MPP, so that we sweep transactions
with several HTLCs. This forces the payment manager to aggregate
first-stage HTLC tx inputs. second-stage are not batched for now.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ecdsa@f321x@SomberNight
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
wallet: RBF batch payments manager by ecdsa · Pull Request #9298 · spesmilo/electrum · GitHub
Skip to content

wallet: RBF batch payments manager - #9298

Merged
ecdsa merged 1 commit into
masterfrom
batch_payments_manager
Mar 13, 2025
Merged

wallet: RBF batch payments manager#9298
ecdsa merged 1 commit into
masterfrom
batch_payments_manager

Conversation

@ecdsa

@ecdsaecdsa commented Nov 12, 2024

Copy link
Copy Markdown
Member

note: this is not "reorg safe", meaning that there is no guarantee that all payments will end up in in the blockchain.
However, I believe this is "double send safe", meaning that we will never send a payment twice.

@ecdsa
ecdsa marked this pull request as ready for review November 12, 2024 10:20
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from b71b11f to 45c7543CompareNovember 14, 2024 09:21
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from a48e7ca to 5c7a247CompareDecember 4, 2024 10:34
@ecdsaecdsa added this to the 4.6.0 milestone Dec 4, 2024
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from 3bdbf87 to 3ad4406CompareDecember 10, 2024 09:24
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9691a83 to 7a40399CompareJanuary 16, 2025 08:52
@ecdsa
ecdsa marked this pull request as draft January 16, 2025 13:21
@spesmilospesmilo deleted a comment Jan 27, 2025
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 14 times, most recently from 4826f7e to 5fd2ec7CompareFebruary 16, 2025 10:10
@f321x

Copy link
Copy Markdown
Member

I get this exception and electrum crashes when batching is enabled and trying to fully spend an unconfirmed utxo from the "Coins" tab with right click -> fully spend -> send to address in clipboard.

Traceback (most recent call last):
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 116, in timer_actions
self.update()
~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 120, in update
self.update_tx()
~~~~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 641, in update_tx
self.tx = self.make_tx(fee_estimator, confirmed_only=confirmed_only)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/gui/qt/send_tab.py", line 320, in <lambda>
make_tx = lambda fee_est, *, confirmed_only=False: self.wallet.make_unsigned_transaction(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
coins=get_coins(nonlocal_only=nonlocal_only, confirmed_only=confirmed_only),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
outputs=outputs,
^^^^^^^^^^^^^^^^
fee=fee_est,
^^^^^^^^^^^^
is_sweep=is_sweep)
^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/util.py", line 492, in do_profile
o = func(*args, **kw_args)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1774, in get_unconfirmed_base_tx_for_batching
output_amount = sum(o.value for o in outputs)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9daa851 to 3f8bc37CompareFebruary 20, 2025 17:49
@ecdsa

Copy link
Copy Markdown
MemberAuthor

File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)

This does not correspond to the code in the batch_payment_manager branch.
get_unconfirmed_base_tx_for_batching is not used anymore (and should probably be removed)

@f321x

Copy link
Copy Markdown
Member

Can confirm it doesn't happen on this branch, only on master.

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 2 times, most recently from 1b9218c to be6f9bbCompareFebruary 21, 2025 11:43
Comment threadelectrum/txbatcher.py Outdated
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9f589b0 to ccb0cc3CompareFebruary 23, 2025 09:10
@ecdsa

Copy link
Copy Markdown
MemberAuthor

Note: This PR does not work well with fee settings.

When we change the fee settings in ConfirmTxDialog, this side effects the fee settings in config, which is in turn used by TxBatcher. I think we should use a FeeEstimator object that holds fee settings and provides fee estimates, without committing the settings to config.

SomberNight
SomberNight previously requested changes Feb 25, 2025
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/lnwatcher.py Outdated
Comment threadelectrum/wallet.py
The class TxBatcher handles the creation, broadcast and replacement
of replaceable transactions. Callers (LNWatcher, SwapManager) use
methods add_payment_output and add_sweep_info. Transactions
created by TxBatcher may combine sweeps and outgoing payments.
Transactions created by TxBatcher will have their fee bumped
automatically (this was only the case for sweeps before).
TxBatcher manages several TxBatches. TxBatches are created
dynamically when needed.
The GUI does not touch txbatcher transactions:
- wallet.get_candidates_for_batching excludes txbatcher
transactions
- RBF dialogs do not work with txbatcher transactions
wallet:
- instead of reading config variables, make_unsigned_transaction
takes new parameters: base_tx, send_change_to_lighting
tests:
- unit tests in test_txbatcher.py (replaces test_sswaps.py)
- force all regtests to use MPP, so that we sweep transactions
with several HTLCs. This forces the payment manager to aggregate
first-stage HTLC tx inputs. second-stage are not batched for now.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ecdsa@f321x@SomberNight
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' wallet: RBF batch payments manager by ecdsa · Pull Request #9298 · spesmilo/electrum · GitHub
Skip to content

wallet: RBF batch payments manager - #9298

Merged
ecdsa merged 1 commit into
masterfrom
batch_payments_manager
Mar 13, 2025
Merged

wallet: RBF batch payments manager#9298
ecdsa merged 1 commit into
masterfrom
batch_payments_manager

Conversation

@ecdsa

@ecdsaecdsa commented Nov 12, 2024

Copy link
Copy Markdown
Member

note: this is not "reorg safe", meaning that there is no guarantee that all payments will end up in in the blockchain.
However, I believe this is "double send safe", meaning that we will never send a payment twice.

@ecdsa
ecdsa marked this pull request as ready for review November 12, 2024 10:20
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from b71b11f to 45c7543CompareNovember 14, 2024 09:21
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from a48e7ca to 5c7a247CompareDecember 4, 2024 10:34
@ecdsaecdsa added this to the 4.6.0 milestone Dec 4, 2024
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from 3bdbf87 to 3ad4406CompareDecember 10, 2024 09:24
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9691a83 to 7a40399CompareJanuary 16, 2025 08:52
@ecdsa
ecdsa marked this pull request as draft January 16, 2025 13:21
@spesmilospesmilo deleted a comment Jan 27, 2025
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 14 times, most recently from 4826f7e to 5fd2ec7CompareFebruary 16, 2025 10:10
@f321x

Copy link
Copy Markdown
Member

I get this exception and electrum crashes when batching is enabled and trying to fully spend an unconfirmed utxo from the "Coins" tab with right click -> fully spend -> send to address in clipboard.

Traceback (most recent call last):
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 116, in timer_actions
self.update()
~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 120, in update
self.update_tx()
~~~~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 641, in update_tx
self.tx = self.make_tx(fee_estimator, confirmed_only=confirmed_only)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/gui/qt/send_tab.py", line 320, in <lambda>
make_tx = lambda fee_est, *, confirmed_only=False: self.wallet.make_unsigned_transaction(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
coins=get_coins(nonlocal_only=nonlocal_only, confirmed_only=confirmed_only),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
outputs=outputs,
^^^^^^^^^^^^^^^^
fee=fee_est,
^^^^^^^^^^^^
is_sweep=is_sweep)
^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/util.py", line 492, in do_profile
o = func(*args, **kw_args)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1774, in get_unconfirmed_base_tx_for_batching
output_amount = sum(o.value for o in outputs)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9daa851 to 3f8bc37CompareFebruary 20, 2025 17:49
@ecdsa

Copy link
Copy Markdown
MemberAuthor

File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)

This does not correspond to the code in the batch_payment_manager branch.
get_unconfirmed_base_tx_for_batching is not used anymore (and should probably be removed)

@f321x

Copy link
Copy Markdown
Member

Can confirm it doesn't happen on this branch, only on master.

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 2 times, most recently from 1b9218c to be6f9bbCompareFebruary 21, 2025 11:43
Comment threadelectrum/txbatcher.py Outdated
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9f589b0 to ccb0cc3CompareFebruary 23, 2025 09:10
@ecdsa

Copy link
Copy Markdown
MemberAuthor

Note: This PR does not work well with fee settings.

When we change the fee settings in ConfirmTxDialog, this side effects the fee settings in config, which is in turn used by TxBatcher. I think we should use a FeeEstimator object that holds fee settings and provides fee estimates, without committing the settings to config.

SomberNight
SomberNight previously requested changes Feb 25, 2025
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/lnwatcher.py Outdated
Comment threadelectrum/wallet.py
The class TxBatcher handles the creation, broadcast and replacement
of replaceable transactions. Callers (LNWatcher, SwapManager) use
methods add_payment_output and add_sweep_info. Transactions
created by TxBatcher may combine sweeps and outgoing payments.
Transactions created by TxBatcher will have their fee bumped
automatically (this was only the case for sweeps before).
TxBatcher manages several TxBatches. TxBatches are created
dynamically when needed.
The GUI does not touch txbatcher transactions:
- wallet.get_candidates_for_batching excludes txbatcher
transactions
- RBF dialogs do not work with txbatcher transactions
wallet:
- instead of reading config variables, make_unsigned_transaction
takes new parameters: base_tx, send_change_to_lighting
tests:
- unit tests in test_txbatcher.py (replaces test_sswaps.py)
- force all regtests to use MPP, so that we sweep transactions
with several HTLCs. This forces the payment manager to aggregate
first-stage HTLC tx inputs. second-stage are not batched for now.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ecdsa@f321x@SomberNight
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' wallet: RBF batch payments manager by ecdsa · Pull Request #9298 · spesmilo/electrum · GitHub
Skip to content

wallet: RBF batch payments manager - #9298

Merged
ecdsa merged 1 commit into
masterfrom
batch_payments_manager
Mar 13, 2025
Merged

wallet: RBF batch payments manager#9298
ecdsa merged 1 commit into
masterfrom
batch_payments_manager

Conversation

@ecdsa

@ecdsaecdsa commented Nov 12, 2024

Copy link
Copy Markdown
Member

note: this is not "reorg safe", meaning that there is no guarantee that all payments will end up in in the blockchain.
However, I believe this is "double send safe", meaning that we will never send a payment twice.

@ecdsa
ecdsa marked this pull request as ready for review November 12, 2024 10:20
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from b71b11f to 45c7543CompareNovember 14, 2024 09:21
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from a48e7ca to 5c7a247CompareDecember 4, 2024 10:34
@ecdsaecdsa added this to the 4.6.0 milestone Dec 4, 2024
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from 3bdbf87 to 3ad4406CompareDecember 10, 2024 09:24
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9691a83 to 7a40399CompareJanuary 16, 2025 08:52
@ecdsa
ecdsa marked this pull request as draft January 16, 2025 13:21
@spesmilospesmilo deleted a comment Jan 27, 2025
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 14 times, most recently from 4826f7e to 5fd2ec7CompareFebruary 16, 2025 10:10
@f321x

Copy link
Copy Markdown
Member

I get this exception and electrum crashes when batching is enabled and trying to fully spend an unconfirmed utxo from the "Coins" tab with right click -> fully spend -> send to address in clipboard.

Traceback (most recent call last):
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 116, in timer_actions
self.update()
~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 120, in update
self.update_tx()
~~~~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 641, in update_tx
self.tx = self.make_tx(fee_estimator, confirmed_only=confirmed_only)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/gui/qt/send_tab.py", line 320, in <lambda>
make_tx = lambda fee_est, *, confirmed_only=False: self.wallet.make_unsigned_transaction(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
coins=get_coins(nonlocal_only=nonlocal_only, confirmed_only=confirmed_only),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
outputs=outputs,
^^^^^^^^^^^^^^^^
fee=fee_est,
^^^^^^^^^^^^
is_sweep=is_sweep)
^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/util.py", line 492, in do_profile
o = func(*args, **kw_args)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1774, in get_unconfirmed_base_tx_for_batching
output_amount = sum(o.value for o in outputs)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9daa851 to 3f8bc37CompareFebruary 20, 2025 17:49
@ecdsa

Copy link
Copy Markdown
MemberAuthor

File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)

This does not correspond to the code in the batch_payment_manager branch.
get_unconfirmed_base_tx_for_batching is not used anymore (and should probably be removed)

@f321x

Copy link
Copy Markdown
Member

Can confirm it doesn't happen on this branch, only on master.

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 2 times, most recently from 1b9218c to be6f9bbCompareFebruary 21, 2025 11:43
Comment threadelectrum/txbatcher.py Outdated
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9f589b0 to ccb0cc3CompareFebruary 23, 2025 09:10
@ecdsa

Copy link
Copy Markdown
MemberAuthor

Note: This PR does not work well with fee settings.

When we change the fee settings in ConfirmTxDialog, this side effects the fee settings in config, which is in turn used by TxBatcher. I think we should use a FeeEstimator object that holds fee settings and provides fee estimates, without committing the settings to config.

SomberNight
SomberNight previously requested changes Feb 25, 2025
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/lnwatcher.py Outdated
Comment threadelectrum/wallet.py
The class TxBatcher handles the creation, broadcast and replacement
of replaceable transactions. Callers (LNWatcher, SwapManager) use
methods add_payment_output and add_sweep_info. Transactions
created by TxBatcher may combine sweeps and outgoing payments.
Transactions created by TxBatcher will have their fee bumped
automatically (this was only the case for sweeps before).
TxBatcher manages several TxBatches. TxBatches are created
dynamically when needed.
The GUI does not touch txbatcher transactions:
- wallet.get_candidates_for_batching excludes txbatcher
transactions
- RBF dialogs do not work with txbatcher transactions
wallet:
- instead of reading config variables, make_unsigned_transaction
takes new parameters: base_tx, send_change_to_lighting
tests:
- unit tests in test_txbatcher.py (replaces test_sswaps.py)
- force all regtests to use MPP, so that we sweep transactions
with several HTLCs. This forces the payment manager to aggregate
first-stage HTLC tx inputs. second-stage are not batched for now.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ecdsa@f321x@SomberNight
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' wallet: RBF batch payments manager by ecdsa · Pull Request #9298 · spesmilo/electrum · GitHub
Skip to content

wallet: RBF batch payments manager - #9298

Merged
ecdsa merged 1 commit into
masterfrom
batch_payments_manager
Mar 13, 2025
Merged

wallet: RBF batch payments manager#9298
ecdsa merged 1 commit into
masterfrom
batch_payments_manager

Conversation

@ecdsa

@ecdsaecdsa commented Nov 12, 2024

Copy link
Copy Markdown
Member

note: this is not "reorg safe", meaning that there is no guarantee that all payments will end up in in the blockchain.
However, I believe this is "double send safe", meaning that we will never send a payment twice.

@ecdsa
ecdsa marked this pull request as ready for review November 12, 2024 10:20
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from b71b11f to 45c7543CompareNovember 14, 2024 09:21
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from a48e7ca to 5c7a247CompareDecember 4, 2024 10:34
@ecdsaecdsa added this to the 4.6.0 milestone Dec 4, 2024
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from 3bdbf87 to 3ad4406CompareDecember 10, 2024 09:24
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9691a83 to 7a40399CompareJanuary 16, 2025 08:52
@ecdsa
ecdsa marked this pull request as draft January 16, 2025 13:21
@spesmilospesmilo deleted a comment Jan 27, 2025
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 14 times, most recently from 4826f7e to 5fd2ec7CompareFebruary 16, 2025 10:10
@f321x

Copy link
Copy Markdown
Member

I get this exception and electrum crashes when batching is enabled and trying to fully spend an unconfirmed utxo from the "Coins" tab with right click -> fully spend -> send to address in clipboard.

Traceback (most recent call last):
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 116, in timer_actions
self.update()
~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 120, in update
self.update_tx()
~~~~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 641, in update_tx
self.tx = self.make_tx(fee_estimator, confirmed_only=confirmed_only)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/gui/qt/send_tab.py", line 320, in <lambda>
make_tx = lambda fee_est, *, confirmed_only=False: self.wallet.make_unsigned_transaction(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
coins=get_coins(nonlocal_only=nonlocal_only, confirmed_only=confirmed_only),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
outputs=outputs,
^^^^^^^^^^^^^^^^
fee=fee_est,
^^^^^^^^^^^^
is_sweep=is_sweep)
^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/util.py", line 492, in do_profile
o = func(*args, **kw_args)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1774, in get_unconfirmed_base_tx_for_batching
output_amount = sum(o.value for o in outputs)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9daa851 to 3f8bc37CompareFebruary 20, 2025 17:49
@ecdsa

Copy link
Copy Markdown
MemberAuthor

File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)

This does not correspond to the code in the batch_payment_manager branch.
get_unconfirmed_base_tx_for_batching is not used anymore (and should probably be removed)

@f321x

Copy link
Copy Markdown
Member

Can confirm it doesn't happen on this branch, only on master.

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 2 times, most recently from 1b9218c to be6f9bbCompareFebruary 21, 2025 11:43
Comment threadelectrum/txbatcher.py Outdated
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9f589b0 to ccb0cc3CompareFebruary 23, 2025 09:10
@ecdsa

Copy link
Copy Markdown
MemberAuthor

Note: This PR does not work well with fee settings.

When we change the fee settings in ConfirmTxDialog, this side effects the fee settings in config, which is in turn used by TxBatcher. I think we should use a FeeEstimator object that holds fee settings and provides fee estimates, without committing the settings to config.

SomberNight
SomberNight previously requested changes Feb 25, 2025
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/lnwatcher.py Outdated
Comment threadelectrum/wallet.py
The class TxBatcher handles the creation, broadcast and replacement
of replaceable transactions. Callers (LNWatcher, SwapManager) use
methods add_payment_output and add_sweep_info. Transactions
created by TxBatcher may combine sweeps and outgoing payments.
Transactions created by TxBatcher will have their fee bumped
automatically (this was only the case for sweeps before).
TxBatcher manages several TxBatches. TxBatches are created
dynamically when needed.
The GUI does not touch txbatcher transactions:
- wallet.get_candidates_for_batching excludes txbatcher
transactions
- RBF dialogs do not work with txbatcher transactions
wallet:
- instead of reading config variables, make_unsigned_transaction
takes new parameters: base_tx, send_change_to_lighting
tests:
- unit tests in test_txbatcher.py (replaces test_sswaps.py)
- force all regtests to use MPP, so that we sweep transactions
with several HTLCs. This forces the payment manager to aggregate
first-stage HTLC tx inputs. second-stage are not batched for now.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ecdsa@f321x@SomberNight
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' wallet: RBF batch payments manager by ecdsa · Pull Request #9298 · spesmilo/electrum · GitHub
Skip to content

wallet: RBF batch payments manager - #9298

Merged
ecdsa merged 1 commit into
masterfrom
batch_payments_manager
Mar 13, 2025
Merged

wallet: RBF batch payments manager#9298
ecdsa merged 1 commit into
masterfrom
batch_payments_manager

Conversation

@ecdsa

@ecdsaecdsa commented Nov 12, 2024

Copy link
Copy Markdown
Member

note: this is not "reorg safe", meaning that there is no guarantee that all payments will end up in in the blockchain.
However, I believe this is "double send safe", meaning that we will never send a payment twice.

@ecdsa
ecdsa marked this pull request as ready for review November 12, 2024 10:20
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from b71b11f to 45c7543CompareNovember 14, 2024 09:21
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from a48e7ca to 5c7a247CompareDecember 4, 2024 10:34
@ecdsaecdsa added this to the 4.6.0 milestone Dec 4, 2024
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from 3bdbf87 to 3ad4406CompareDecember 10, 2024 09:24
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9691a83 to 7a40399CompareJanuary 16, 2025 08:52
@ecdsa
ecdsa marked this pull request as draft January 16, 2025 13:21
@spesmilospesmilo deleted a comment Jan 27, 2025
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 14 times, most recently from 4826f7e to 5fd2ec7CompareFebruary 16, 2025 10:10
@f321x

Copy link
Copy Markdown
Member

I get this exception and electrum crashes when batching is enabled and trying to fully spend an unconfirmed utxo from the "Coins" tab with right click -> fully spend -> send to address in clipboard.

Traceback (most recent call last):
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 116, in timer_actions
self.update()
~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 120, in update
self.update_tx()
~~~~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 641, in update_tx
self.tx = self.make_tx(fee_estimator, confirmed_only=confirmed_only)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/gui/qt/send_tab.py", line 320, in <lambda>
make_tx = lambda fee_est, *, confirmed_only=False: self.wallet.make_unsigned_transaction(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
coins=get_coins(nonlocal_only=nonlocal_only, confirmed_only=confirmed_only),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
outputs=outputs,
^^^^^^^^^^^^^^^^
fee=fee_est,
^^^^^^^^^^^^
is_sweep=is_sweep)
^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/util.py", line 492, in do_profile
o = func(*args, **kw_args)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1774, in get_unconfirmed_base_tx_for_batching
output_amount = sum(o.value for o in outputs)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9daa851 to 3f8bc37CompareFebruary 20, 2025 17:49
@ecdsa

Copy link
Copy Markdown
MemberAuthor

File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)

This does not correspond to the code in the batch_payment_manager branch.
get_unconfirmed_base_tx_for_batching is not used anymore (and should probably be removed)

@f321x

Copy link
Copy Markdown
Member

Can confirm it doesn't happen on this branch, only on master.

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 2 times, most recently from 1b9218c to be6f9bbCompareFebruary 21, 2025 11:43
Comment threadelectrum/txbatcher.py Outdated
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9f589b0 to ccb0cc3CompareFebruary 23, 2025 09:10
@ecdsa

Copy link
Copy Markdown
MemberAuthor

Note: This PR does not work well with fee settings.

When we change the fee settings in ConfirmTxDialog, this side effects the fee settings in config, which is in turn used by TxBatcher. I think we should use a FeeEstimator object that holds fee settings and provides fee estimates, without committing the settings to config.

SomberNight
SomberNight previously requested changes Feb 25, 2025
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/lnwatcher.py Outdated
Comment threadelectrum/wallet.py
The class TxBatcher handles the creation, broadcast and replacement
of replaceable transactions. Callers (LNWatcher, SwapManager) use
methods add_payment_output and add_sweep_info. Transactions
created by TxBatcher may combine sweeps and outgoing payments.
Transactions created by TxBatcher will have their fee bumped
automatically (this was only the case for sweeps before).
TxBatcher manages several TxBatches. TxBatches are created
dynamically when needed.
The GUI does not touch txbatcher transactions:
- wallet.get_candidates_for_batching excludes txbatcher
transactions
- RBF dialogs do not work with txbatcher transactions
wallet:
- instead of reading config variables, make_unsigned_transaction
takes new parameters: base_tx, send_change_to_lighting
tests:
- unit tests in test_txbatcher.py (replaces test_sswaps.py)
- force all regtests to use MPP, so that we sweep transactions
with several HTLCs. This forces the payment manager to aggregate
first-stage HTLC tx inputs. second-stage are not batched for now.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ecdsa@f321x@SomberNight
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' wallet: RBF batch payments manager by ecdsa · Pull Request #9298 · spesmilo/electrum · GitHub
Skip to content

wallet: RBF batch payments manager - #9298

Merged
ecdsa merged 1 commit into
masterfrom
batch_payments_manager
Mar 13, 2025
Merged

wallet: RBF batch payments manager#9298
ecdsa merged 1 commit into
masterfrom
batch_payments_manager

Conversation

@ecdsa

@ecdsaecdsa commented Nov 12, 2024

Copy link
Copy Markdown
Member

note: this is not "reorg safe", meaning that there is no guarantee that all payments will end up in in the blockchain.
However, I believe this is "double send safe", meaning that we will never send a payment twice.

@ecdsa
ecdsa marked this pull request as ready for review November 12, 2024 10:20
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from b71b11f to 45c7543CompareNovember 14, 2024 09:21
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from a48e7ca to 5c7a247CompareDecember 4, 2024 10:34
@ecdsaecdsa added this to the 4.6.0 milestone Dec 4, 2024
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from 3bdbf87 to 3ad4406CompareDecember 10, 2024 09:24
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9691a83 to 7a40399CompareJanuary 16, 2025 08:52
@ecdsa
ecdsa marked this pull request as draft January 16, 2025 13:21
@spesmilospesmilo deleted a comment Jan 27, 2025
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 14 times, most recently from 4826f7e to 5fd2ec7CompareFebruary 16, 2025 10:10
@f321x

Copy link
Copy Markdown
Member

I get this exception and electrum crashes when batching is enabled and trying to fully spend an unconfirmed utxo from the "Coins" tab with right click -> fully spend -> send to address in clipboard.

Traceback (most recent call last):
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 116, in timer_actions
self.update()
~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 120, in update
self.update_tx()
~~~~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 641, in update_tx
self.tx = self.make_tx(fee_estimator, confirmed_only=confirmed_only)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/gui/qt/send_tab.py", line 320, in <lambda>
make_tx = lambda fee_est, *, confirmed_only=False: self.wallet.make_unsigned_transaction(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
coins=get_coins(nonlocal_only=nonlocal_only, confirmed_only=confirmed_only),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
outputs=outputs,
^^^^^^^^^^^^^^^^
fee=fee_est,
^^^^^^^^^^^^
is_sweep=is_sweep)
^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/util.py", line 492, in do_profile
o = func(*args, **kw_args)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1774, in get_unconfirmed_base_tx_for_batching
output_amount = sum(o.value for o in outputs)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9daa851 to 3f8bc37CompareFebruary 20, 2025 17:49
@ecdsa

Copy link
Copy Markdown
MemberAuthor

File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)

This does not correspond to the code in the batch_payment_manager branch.
get_unconfirmed_base_tx_for_batching is not used anymore (and should probably be removed)

@f321x

Copy link
Copy Markdown
Member

Can confirm it doesn't happen on this branch, only on master.

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 2 times, most recently from 1b9218c to be6f9bbCompareFebruary 21, 2025 11:43
Comment threadelectrum/txbatcher.py Outdated
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9f589b0 to ccb0cc3CompareFebruary 23, 2025 09:10
@ecdsa

Copy link
Copy Markdown
MemberAuthor

Note: This PR does not work well with fee settings.

When we change the fee settings in ConfirmTxDialog, this side effects the fee settings in config, which is in turn used by TxBatcher. I think we should use a FeeEstimator object that holds fee settings and provides fee estimates, without committing the settings to config.

SomberNight
SomberNight previously requested changes Feb 25, 2025
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/lnwatcher.py Outdated
Comment threadelectrum/wallet.py
The class TxBatcher handles the creation, broadcast and replacement
of replaceable transactions. Callers (LNWatcher, SwapManager) use
methods add_payment_output and add_sweep_info. Transactions
created by TxBatcher may combine sweeps and outgoing payments.
Transactions created by TxBatcher will have their fee bumped
automatically (this was only the case for sweeps before).
TxBatcher manages several TxBatches. TxBatches are created
dynamically when needed.
The GUI does not touch txbatcher transactions:
- wallet.get_candidates_for_batching excludes txbatcher
transactions
- RBF dialogs do not work with txbatcher transactions
wallet:
- instead of reading config variables, make_unsigned_transaction
takes new parameters: base_tx, send_change_to_lighting
tests:
- unit tests in test_txbatcher.py (replaces test_sswaps.py)
- force all regtests to use MPP, so that we sweep transactions
with several HTLCs. This forces the payment manager to aggregate
first-stage HTLC tx inputs. second-stage are not batched for now.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ecdsa@f321x@SomberNight
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); wallet: RBF batch payments manager by ecdsa · Pull Request #9298 · spesmilo/electrum · GitHub
Skip to content

wallet: RBF batch payments manager - #9298

Merged
ecdsa merged 1 commit into
masterfrom
batch_payments_manager
Mar 13, 2025
Merged

wallet: RBF batch payments manager#9298
ecdsa merged 1 commit into
masterfrom
batch_payments_manager

Conversation

@ecdsa

@ecdsaecdsa commented Nov 12, 2024

Copy link
Copy Markdown
Member

note: this is not "reorg safe", meaning that there is no guarantee that all payments will end up in in the blockchain.
However, I believe this is "double send safe", meaning that we will never send a payment twice.

@ecdsa
ecdsa marked this pull request as ready for review November 12, 2024 10:20
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from b71b11f to 45c7543CompareNovember 14, 2024 09:21
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from a48e7ca to 5c7a247CompareDecember 4, 2024 10:34
@ecdsaecdsa added this to the 4.6.0 milestone Dec 4, 2024
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 13 times, most recently from 3bdbf87 to 3ad4406CompareDecember 10, 2024 09:24
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9691a83 to 7a40399CompareJanuary 16, 2025 08:52
@ecdsa
ecdsa marked this pull request as draft January 16, 2025 13:21
@spesmilospesmilo deleted a comment Jan 27, 2025
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 14 times, most recently from 4826f7e to 5fd2ec7CompareFebruary 16, 2025 10:10
@f321x

Copy link
Copy Markdown
Member

I get this exception and electrum crashes when batching is enabled and trying to fully spend an unconfirmed utxo from the "Coins" tab with right click -> fully spend -> send to address in clipboard.

Traceback (most recent call last):
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 116, in timer_actions
self.update()
~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 120, in update
self.update_tx()
~~~~~~~~~~~~~~^^
File "/home/user/code/electrum-fork/electrum/gui/qt/confirm_tx_dialog.py", line 641, in update_tx
self.tx = self.make_tx(fee_estimator, confirmed_only=confirmed_only)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/gui/qt/send_tab.py", line 320, in <lambda>
make_tx = lambda fee_est, *, confirmed_only=False: self.wallet.make_unsigned_transaction(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
coins=get_coins(nonlocal_only=nonlocal_only, confirmed_only=confirmed_only),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
outputs=outputs,
^^^^^^^^^^^^^^^^
fee=fee_est,
^^^^^^^^^^^^
is_sweep=is_sweep)
^^^^^^^^^^^^^^^^^^
File "/home/user/code/electrum-fork/electrum/util.py", line 492, in do_profile
o = func(*args, **kw_args)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)
File "/home/user/code/electrum-fork/electrum/wallet.py", line 1774, in get_unconfirmed_base_tx_for_batching
output_amount = sum(o.value for o in outputs)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9daa851 to 3f8bc37CompareFebruary 20, 2025 17:49
@ecdsa

Copy link
Copy Markdown
MemberAuthor

File "/home/user/code/electrum-fork/electrum/wallet.py", line 1879, in make_unsigned_transaction
base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins)

This does not correspond to the code in the batch_payment_manager branch.
get_unconfirmed_base_tx_for_batching is not used anymore (and should probably be removed)

@f321x

Copy link
Copy Markdown
Member

Can confirm it doesn't happen on this branch, only on master.

@ecdsa
ecdsaforce-pushed the batch_payments_manager branch 2 times, most recently from 1b9218c to be6f9bbCompareFebruary 21, 2025 11:43
Comment threadelectrum/txbatcher.py Outdated
@ecdsa
ecdsaforce-pushed the batch_payments_manager branch from 9f589b0 to ccb0cc3CompareFebruary 23, 2025 09:10
@ecdsa

Copy link
Copy Markdown
MemberAuthor

Note: This PR does not work well with fee settings.

When we change the fee settings in ConfirmTxDialog, this side effects the fee settings in config, which is in turn used by TxBatcher. I think we should use a FeeEstimator object that holds fee settings and provides fee estimates, without committing the settings to config.

SomberNight
SomberNight previously requested changes Feb 25, 2025
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/txbatcher.py
Comment threadelectrum/lnwatcher.py Outdated
Comment threadelectrum/wallet.py
The class TxBatcher handles the creation, broadcast and replacement
of replaceable transactions. Callers (LNWatcher, SwapManager) use
methods add_payment_output and add_sweep_info. Transactions
created by TxBatcher may combine sweeps and outgoing payments.
Transactions created by TxBatcher will have their fee bumped
automatically (this was only the case for sweeps before).
TxBatcher manages several TxBatches. TxBatches are created
dynamically when needed.
The GUI does not touch txbatcher transactions:
- wallet.get_candidates_for_batching excludes txbatcher
transactions
- RBF dialogs do not work with txbatcher transactions
wallet:
- instead of reading config variables, make_unsigned_transaction
takes new parameters: base_tx, send_change_to_lighting
tests:
- unit tests in test_txbatcher.py (replaces test_sswaps.py)
- force all regtests to use MPP, so that we sweep transactions
with several HTLCs. This forces the payment manager to aggregate
first-stage HTLC tx inputs. second-stage are not batched for now.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ecdsa@f321x@SomberNight