Add --rescan-from-height CLI argument - #196

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg
Jul 2, 2026
Merged

Add --rescan-from-height CLI argument#196
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg

Conversation

@tnull

@tnulltnull commented Apr 21, 2026

Copy link
Copy Markdown
Collaborator

Based on lightningdevkit/ldk-node#884

We expose --rescan-from-height and --force-wallet-full-scan CLI arguments. First we bump the LDK Node dependency though, to include the changes from #884.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 21, 2026

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft April 21, 2026 13:09
tnull added 3 commits June 30, 2026 10:08
Use the latest LDK Node main revision now that wallet recovery
support has landed upstream.
Keep ldk-server compiling across the dependency's API changes so
the remaining branch commits can focus on startup flags.
Co-Authored-By: HAL 9000
Expose a startup option for bitcoind-backed wallet recovery
without silently accepting unsupported chain sources.
Pass the height through to LDK Node only when the bitcoind
RPC chain source is configured.
Co-Authored-By: HAL 9000
Expose a startup option for Electrum and Esplora wallet
recovery without accepting it for bitcoind RPC.
Pass the request through LDK Node sync config so a full scan
is forced until one succeeds.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-04-rescan-from-height-arg branch from bc347e8 to 879e589CompareJune 30, 2026 08:19
@tnull
tnull marked this pull request as ready for review June 30, 2026 08:20
@tnull
tnull requested a review from benthecarmanJune 30, 2026 08:20

@benthecarmanbenthecarman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see you excluded these from the toml config, makes sense because its not really something you set persistently, just for a single run. Should we exclude the env variations for these too then? Env variables feel similar to me but maybe that's just my systemd preference coming out

if self.force_wallet_full_scan {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--force-wallet-full-scan` requires the Electrum or Esplora chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference rescan-from-height in this error message

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, could you expand what you're thinking of there? Seems they are slightly orthogonal, so not sure why we need the cross-referencing?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If someone is setting --force-wallet-full-scan with a bitcoind backend I presume they are trying to rescan for missing funds and we should direct them to --rescan-from-height which is the config for their backend

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But they do slightly different things? Isn't it even more confusing to point to something that works differently than the thing you're trying to do? Note we already do a full scan on first startup anyways, so differntly to --rescan-from-height it's not required to import an old wallet from seed necessarily.

@benthecarmanbenthecarmanJul 2, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Don't feel too strongly though, so if you dont want to, that's fine

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Hmm, but the usecase is different to begin with? --rescan-from-height should be used once when you import from pre-existing seed, while --force-full-scan is more a utility that you only need if for some reason you discover there are still funds missing after the fact?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They are both "I'm missing funds, rescan chain" but yeah, I don't feel too strongly either way

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference --force-wallet-full-scan in this error message

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

@tnull
tnull merged commit 2a9da60 into lightningdevkit:mainJul 2, 2026
10 checks passed
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

@tnull@ldk-reviews-bot@benthecarman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add --rescan-from-height CLI argument - #196

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg
Jul 2, 2026
Merged

Add --rescan-from-height CLI argument#196
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg

Conversation

@tnull

@tnulltnull commented Apr 21, 2026

Copy link
Copy Markdown
Collaborator

Based on lightningdevkit/ldk-node#884

We expose --rescan-from-height and --force-wallet-full-scan CLI arguments. First we bump the LDK Node dependency though, to include the changes from #884.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 21, 2026

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft April 21, 2026 13:09
tnull added 3 commits June 30, 2026 10:08
Use the latest LDK Node main revision now that wallet recovery
support has landed upstream.
Keep ldk-server compiling across the dependency's API changes so
the remaining branch commits can focus on startup flags.
Co-Authored-By: HAL 9000
Expose a startup option for bitcoind-backed wallet recovery
without silently accepting unsupported chain sources.
Pass the height through to LDK Node only when the bitcoind
RPC chain source is configured.
Co-Authored-By: HAL 9000
Expose a startup option for Electrum and Esplora wallet
recovery without accepting it for bitcoind RPC.
Pass the request through LDK Node sync config so a full scan
is forced until one succeeds.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-04-rescan-from-height-arg branch from bc347e8 to 879e589CompareJune 30, 2026 08:19
@tnull
tnull marked this pull request as ready for review June 30, 2026 08:20
@tnull
tnull requested a review from benthecarmanJune 30, 2026 08:20

@benthecarmanbenthecarman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see you excluded these from the toml config, makes sense because its not really something you set persistently, just for a single run. Should we exclude the env variations for these too then? Env variables feel similar to me but maybe that's just my systemd preference coming out

if self.force_wallet_full_scan {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--force-wallet-full-scan` requires the Electrum or Esplora chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference rescan-from-height in this error message

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, could you expand what you're thinking of there? Seems they are slightly orthogonal, so not sure why we need the cross-referencing?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If someone is setting --force-wallet-full-scan with a bitcoind backend I presume they are trying to rescan for missing funds and we should direct them to --rescan-from-height which is the config for their backend

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But they do slightly different things? Isn't it even more confusing to point to something that works differently than the thing you're trying to do? Note we already do a full scan on first startup anyways, so differntly to --rescan-from-height it's not required to import an old wallet from seed necessarily.

@benthecarmanbenthecarmanJul 2, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Don't feel too strongly though, so if you dont want to, that's fine

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Hmm, but the usecase is different to begin with? --rescan-from-height should be used once when you import from pre-existing seed, while --force-full-scan is more a utility that you only need if for some reason you discover there are still funds missing after the fact?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They are both "I'm missing funds, rescan chain" but yeah, I don't feel too strongly either way

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference --force-wallet-full-scan in this error message

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

@tnull
tnull merged commit 2a9da60 into lightningdevkit:mainJul 2, 2026
10 checks passed
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

@tnull@ldk-reviews-bot@benthecarman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add --rescan-from-height CLI argument - #196

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg
Jul 2, 2026
Merged

Add --rescan-from-height CLI argument#196
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg

Conversation

@tnull

@tnulltnull commented Apr 21, 2026

Copy link
Copy Markdown
Collaborator

Based on lightningdevkit/ldk-node#884

We expose --rescan-from-height and --force-wallet-full-scan CLI arguments. First we bump the LDK Node dependency though, to include the changes from #884.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 21, 2026

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft April 21, 2026 13:09
tnull added 3 commits June 30, 2026 10:08
Use the latest LDK Node main revision now that wallet recovery
support has landed upstream.
Keep ldk-server compiling across the dependency's API changes so
the remaining branch commits can focus on startup flags.
Co-Authored-By: HAL 9000
Expose a startup option for bitcoind-backed wallet recovery
without silently accepting unsupported chain sources.
Pass the height through to LDK Node only when the bitcoind
RPC chain source is configured.
Co-Authored-By: HAL 9000
Expose a startup option for Electrum and Esplora wallet
recovery without accepting it for bitcoind RPC.
Pass the request through LDK Node sync config so a full scan
is forced until one succeeds.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-04-rescan-from-height-arg branch from bc347e8 to 879e589CompareJune 30, 2026 08:19
@tnull
tnull marked this pull request as ready for review June 30, 2026 08:20
@tnull
tnull requested a review from benthecarmanJune 30, 2026 08:20

@benthecarmanbenthecarman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see you excluded these from the toml config, makes sense because its not really something you set persistently, just for a single run. Should we exclude the env variations for these too then? Env variables feel similar to me but maybe that's just my systemd preference coming out

if self.force_wallet_full_scan {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--force-wallet-full-scan` requires the Electrum or Esplora chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference rescan-from-height in this error message

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, could you expand what you're thinking of there? Seems they are slightly orthogonal, so not sure why we need the cross-referencing?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If someone is setting --force-wallet-full-scan with a bitcoind backend I presume they are trying to rescan for missing funds and we should direct them to --rescan-from-height which is the config for their backend

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But they do slightly different things? Isn't it even more confusing to point to something that works differently than the thing you're trying to do? Note we already do a full scan on first startup anyways, so differntly to --rescan-from-height it's not required to import an old wallet from seed necessarily.

@benthecarmanbenthecarmanJul 2, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Don't feel too strongly though, so if you dont want to, that's fine

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Hmm, but the usecase is different to begin with? --rescan-from-height should be used once when you import from pre-existing seed, while --force-full-scan is more a utility that you only need if for some reason you discover there are still funds missing after the fact?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They are both "I'm missing funds, rescan chain" but yeah, I don't feel too strongly either way

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference --force-wallet-full-scan in this error message

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

@tnull
tnull merged commit 2a9da60 into lightningdevkit:mainJul 2, 2026
10 checks passed
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

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

Add --rescan-from-height CLI argument - #196

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg
Jul 2, 2026
Merged

Add --rescan-from-height CLI argument#196
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg

Conversation

@tnull

@tnulltnull commented Apr 21, 2026

Copy link
Copy Markdown
Collaborator

Based on lightningdevkit/ldk-node#884

We expose --rescan-from-height and --force-wallet-full-scan CLI arguments. First we bump the LDK Node dependency though, to include the changes from #884.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 21, 2026

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft April 21, 2026 13:09
tnull added 3 commits June 30, 2026 10:08
Use the latest LDK Node main revision now that wallet recovery
support has landed upstream.
Keep ldk-server compiling across the dependency's API changes so
the remaining branch commits can focus on startup flags.
Co-Authored-By: HAL 9000
Expose a startup option for bitcoind-backed wallet recovery
without silently accepting unsupported chain sources.
Pass the height through to LDK Node only when the bitcoind
RPC chain source is configured.
Co-Authored-By: HAL 9000
Expose a startup option for Electrum and Esplora wallet
recovery without accepting it for bitcoind RPC.
Pass the request through LDK Node sync config so a full scan
is forced until one succeeds.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-04-rescan-from-height-arg branch from bc347e8 to 879e589CompareJune 30, 2026 08:19
@tnull
tnull marked this pull request as ready for review June 30, 2026 08:20
@tnull
tnull requested a review from benthecarmanJune 30, 2026 08:20

@benthecarmanbenthecarman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see you excluded these from the toml config, makes sense because its not really something you set persistently, just for a single run. Should we exclude the env variations for these too then? Env variables feel similar to me but maybe that's just my systemd preference coming out

if self.force_wallet_full_scan {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--force-wallet-full-scan` requires the Electrum or Esplora chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference rescan-from-height in this error message

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, could you expand what you're thinking of there? Seems they are slightly orthogonal, so not sure why we need the cross-referencing?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If someone is setting --force-wallet-full-scan with a bitcoind backend I presume they are trying to rescan for missing funds and we should direct them to --rescan-from-height which is the config for their backend

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But they do slightly different things? Isn't it even more confusing to point to something that works differently than the thing you're trying to do? Note we already do a full scan on first startup anyways, so differntly to --rescan-from-height it's not required to import an old wallet from seed necessarily.

@benthecarmanbenthecarmanJul 2, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Don't feel too strongly though, so if you dont want to, that's fine

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Hmm, but the usecase is different to begin with? --rescan-from-height should be used once when you import from pre-existing seed, while --force-full-scan is more a utility that you only need if for some reason you discover there are still funds missing after the fact?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They are both "I'm missing funds, rescan chain" but yeah, I don't feel too strongly either way

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference --force-wallet-full-scan in this error message

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

@tnull
tnull merged commit 2a9da60 into lightningdevkit:mainJul 2, 2026
10 checks passed
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

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

Add --rescan-from-height CLI argument - #196

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg
Jul 2, 2026
Merged

Add --rescan-from-height CLI argument#196
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg

Conversation

@tnull

@tnulltnull commented Apr 21, 2026

Copy link
Copy Markdown
Collaborator

Based on lightningdevkit/ldk-node#884

We expose --rescan-from-height and --force-wallet-full-scan CLI arguments. First we bump the LDK Node dependency though, to include the changes from #884.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 21, 2026

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft April 21, 2026 13:09
tnull added 3 commits June 30, 2026 10:08
Use the latest LDK Node main revision now that wallet recovery
support has landed upstream.
Keep ldk-server compiling across the dependency's API changes so
the remaining branch commits can focus on startup flags.
Co-Authored-By: HAL 9000
Expose a startup option for bitcoind-backed wallet recovery
without silently accepting unsupported chain sources.
Pass the height through to LDK Node only when the bitcoind
RPC chain source is configured.
Co-Authored-By: HAL 9000
Expose a startup option for Electrum and Esplora wallet
recovery without accepting it for bitcoind RPC.
Pass the request through LDK Node sync config so a full scan
is forced until one succeeds.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-04-rescan-from-height-arg branch from bc347e8 to 879e589CompareJune 30, 2026 08:19
@tnull
tnull marked this pull request as ready for review June 30, 2026 08:20
@tnull
tnull requested a review from benthecarmanJune 30, 2026 08:20

@benthecarmanbenthecarman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see you excluded these from the toml config, makes sense because its not really something you set persistently, just for a single run. Should we exclude the env variations for these too then? Env variables feel similar to me but maybe that's just my systemd preference coming out

if self.force_wallet_full_scan {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--force-wallet-full-scan` requires the Electrum or Esplora chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference rescan-from-height in this error message

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, could you expand what you're thinking of there? Seems they are slightly orthogonal, so not sure why we need the cross-referencing?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If someone is setting --force-wallet-full-scan with a bitcoind backend I presume they are trying to rescan for missing funds and we should direct them to --rescan-from-height which is the config for their backend

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But they do slightly different things? Isn't it even more confusing to point to something that works differently than the thing you're trying to do? Note we already do a full scan on first startup anyways, so differntly to --rescan-from-height it's not required to import an old wallet from seed necessarily.

@benthecarmanbenthecarmanJul 2, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Don't feel too strongly though, so if you dont want to, that's fine

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Hmm, but the usecase is different to begin with? --rescan-from-height should be used once when you import from pre-existing seed, while --force-full-scan is more a utility that you only need if for some reason you discover there are still funds missing after the fact?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They are both "I'm missing funds, rescan chain" but yeah, I don't feel too strongly either way

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference --force-wallet-full-scan in this error message

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

@tnull
tnull merged commit 2a9da60 into lightningdevkit:mainJul 2, 2026
10 checks passed
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

@tnull@ldk-reviews-bot@benthecarman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add --rescan-from-height CLI argument - #196

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg
Jul 2, 2026
Merged

Add --rescan-from-height CLI argument#196
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg

Conversation

@tnull

@tnulltnull commented Apr 21, 2026

Copy link
Copy Markdown
Collaborator

Based on lightningdevkit/ldk-node#884

We expose --rescan-from-height and --force-wallet-full-scan CLI arguments. First we bump the LDK Node dependency though, to include the changes from #884.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 21, 2026

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft April 21, 2026 13:09
tnull added 3 commits June 30, 2026 10:08
Use the latest LDK Node main revision now that wallet recovery
support has landed upstream.
Keep ldk-server compiling across the dependency's API changes so
the remaining branch commits can focus on startup flags.
Co-Authored-By: HAL 9000
Expose a startup option for bitcoind-backed wallet recovery
without silently accepting unsupported chain sources.
Pass the height through to LDK Node only when the bitcoind
RPC chain source is configured.
Co-Authored-By: HAL 9000
Expose a startup option for Electrum and Esplora wallet
recovery without accepting it for bitcoind RPC.
Pass the request through LDK Node sync config so a full scan
is forced until one succeeds.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-04-rescan-from-height-arg branch from bc347e8 to 879e589CompareJune 30, 2026 08:19
@tnull
tnull marked this pull request as ready for review June 30, 2026 08:20
@tnull
tnull requested a review from benthecarmanJune 30, 2026 08:20

@benthecarmanbenthecarman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see you excluded these from the toml config, makes sense because its not really something you set persistently, just for a single run. Should we exclude the env variations for these too then? Env variables feel similar to me but maybe that's just my systemd preference coming out

if self.force_wallet_full_scan {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--force-wallet-full-scan` requires the Electrum or Esplora chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference rescan-from-height in this error message

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, could you expand what you're thinking of there? Seems they are slightly orthogonal, so not sure why we need the cross-referencing?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If someone is setting --force-wallet-full-scan with a bitcoind backend I presume they are trying to rescan for missing funds and we should direct them to --rescan-from-height which is the config for their backend

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But they do slightly different things? Isn't it even more confusing to point to something that works differently than the thing you're trying to do? Note we already do a full scan on first startup anyways, so differntly to --rescan-from-height it's not required to import an old wallet from seed necessarily.

@benthecarmanbenthecarmanJul 2, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Don't feel too strongly though, so if you dont want to, that's fine

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Hmm, but the usecase is different to begin with? --rescan-from-height should be used once when you import from pre-existing seed, while --force-full-scan is more a utility that you only need if for some reason you discover there are still funds missing after the fact?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They are both "I'm missing funds, rescan chain" but yeah, I don't feel too strongly either way

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference --force-wallet-full-scan in this error message

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

@tnull
tnull merged commit 2a9da60 into lightningdevkit:mainJul 2, 2026
10 checks passed
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

@tnull@ldk-reviews-bot@benthecarman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add --rescan-from-height CLI argument - #196

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg
Jul 2, 2026
Merged

Add --rescan-from-height CLI argument#196
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg

Conversation

@tnull

@tnulltnull commented Apr 21, 2026

Copy link
Copy Markdown
Collaborator

Based on lightningdevkit/ldk-node#884

We expose --rescan-from-height and --force-wallet-full-scan CLI arguments. First we bump the LDK Node dependency though, to include the changes from #884.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 21, 2026

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft April 21, 2026 13:09
tnull added 3 commits June 30, 2026 10:08
Use the latest LDK Node main revision now that wallet recovery
support has landed upstream.
Keep ldk-server compiling across the dependency's API changes so
the remaining branch commits can focus on startup flags.
Co-Authored-By: HAL 9000
Expose a startup option for bitcoind-backed wallet recovery
without silently accepting unsupported chain sources.
Pass the height through to LDK Node only when the bitcoind
RPC chain source is configured.
Co-Authored-By: HAL 9000
Expose a startup option for Electrum and Esplora wallet
recovery without accepting it for bitcoind RPC.
Pass the request through LDK Node sync config so a full scan
is forced until one succeeds.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-04-rescan-from-height-arg branch from bc347e8 to 879e589CompareJune 30, 2026 08:19
@tnull
tnull marked this pull request as ready for review June 30, 2026 08:20
@tnull
tnull requested a review from benthecarmanJune 30, 2026 08:20

@benthecarmanbenthecarman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see you excluded these from the toml config, makes sense because its not really something you set persistently, just for a single run. Should we exclude the env variations for these too then? Env variables feel similar to me but maybe that's just my systemd preference coming out

if self.force_wallet_full_scan {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--force-wallet-full-scan` requires the Electrum or Esplora chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference rescan-from-height in this error message

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, could you expand what you're thinking of there? Seems they are slightly orthogonal, so not sure why we need the cross-referencing?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If someone is setting --force-wallet-full-scan with a bitcoind backend I presume they are trying to rescan for missing funds and we should direct them to --rescan-from-height which is the config for their backend

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But they do slightly different things? Isn't it even more confusing to point to something that works differently than the thing you're trying to do? Note we already do a full scan on first startup anyways, so differntly to --rescan-from-height it's not required to import an old wallet from seed necessarily.

@benthecarmanbenthecarmanJul 2, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Don't feel too strongly though, so if you dont want to, that's fine

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Hmm, but the usecase is different to begin with? --rescan-from-height should be used once when you import from pre-existing seed, while --force-full-scan is more a utility that you only need if for some reason you discover there are still funds missing after the fact?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They are both "I'm missing funds, rescan chain" but yeah, I don't feel too strongly either way

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference --force-wallet-full-scan in this error message

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

@tnull
tnull merged commit 2a9da60 into lightningdevkit:mainJul 2, 2026
10 checks passed
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

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

Add --rescan-from-height CLI argument - #196

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg
Jul 2, 2026
Merged

Add --rescan-from-height CLI argument#196
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2026-04-rescan-from-height-arg

Conversation

@tnull

@tnulltnull commented Apr 21, 2026

Copy link
Copy Markdown
Collaborator

Based on lightningdevkit/ldk-node#884

We expose --rescan-from-height and --force-wallet-full-scan CLI arguments. First we bump the LDK Node dependency though, to include the changes from #884.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 21, 2026

Copy link
Copy Markdown

👋 Hi! This PR is now in draft status.
I'll wait to assign reviewers until you mark it as ready for review.
Just convert it out of draft status when you're ready for review!

@tnull
tnull marked this pull request as draft April 21, 2026 13:09
tnull added 3 commits June 30, 2026 10:08
Use the latest LDK Node main revision now that wallet recovery
support has landed upstream.
Keep ldk-server compiling across the dependency's API changes so
the remaining branch commits can focus on startup flags.
Co-Authored-By: HAL 9000
Expose a startup option for bitcoind-backed wallet recovery
without silently accepting unsupported chain sources.
Pass the height through to LDK Node only when the bitcoind
RPC chain source is configured.
Co-Authored-By: HAL 9000
Expose a startup option for Electrum and Esplora wallet
recovery without accepting it for bitcoind RPC.
Pass the request through LDK Node sync config so a full scan
is forced until one succeeds.
Co-Authored-By: HAL 9000
@tnull
tnullforce-pushed the 2026-04-rescan-from-height-arg branch from bc347e8 to 879e589CompareJune 30, 2026 08:19
@tnull
tnull marked this pull request as ready for review June 30, 2026 08:20
@tnull
tnull requested a review from benthecarmanJune 30, 2026 08:20

@benthecarmanbenthecarman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see you excluded these from the toml config, makes sense because its not really something you set persistently, just for a single run. Should we exclude the env variations for these too then? Env variables feel similar to me but maybe that's just my systemd preference coming out

if self.force_wallet_full_scan {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--force-wallet-full-scan` requires the Electrum or Esplora chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference rescan-from-height in this error message

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, could you expand what you're thinking of there? Seems they are slightly orthogonal, so not sure why we need the cross-referencing?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If someone is setting --force-wallet-full-scan with a bitcoind backend I presume they are trying to rescan for missing funds and we should direct them to --rescan-from-height which is the config for their backend

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But they do slightly different things? Isn't it even more confusing to point to something that works differently than the thing you're trying to do? Note we already do a full scan on first startup anyways, so differntly to --rescan-from-height it's not required to import an old wallet from seed necessarily.

@benthecarmanbenthecarmanJul 2, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Don't feel too strongly though, so if you dont want to, that's fine

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the "works differently" here is mostly just an implementation detail to user that isn't really relevant to the outcome they are looking for.

Hmm, but the usecase is different to begin with? --rescan-from-height should be used once when you import from pre-existing seed, while --force-full-scan is more a utility that you only need if for some reason you discover there are still funds missing after the fact?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They are both "I'm missing funds, rescan chain" but yeah, I don't feel too strongly either way

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should reference --force-wallet-full-scan in this error message

if self.rescan_from_height.is_some() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"`--rescan-from-height` requires the bitcoind RPC chain source.",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

@tnull
tnull merged commit 2a9da60 into lightningdevkit:mainJul 2, 2026
10 checks passed
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

@tnull@ldk-reviews-bot@benthecarman