feat: support all address types - #431

Merged
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types
Mar 5, 2026
Merged

feat: support all address types#431
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types

Conversation

@ben-kaufman

Copy link
Copy Markdown
Contributor

This PR adds support for multiple Bitcoin address types in the iOS app, allowing users to select and monitor different address formats. Users can select their preferred address type from: Legacy (P2PKH), Nested SegWit (P2SH-P2WPKH), Native SegWit (P2WPKH), and Taproot (P2TR).

This requires extensive testing across all functionalities, send, receive, channel open, channel close (funds should always go to native segwit address except when selected address when channel opened was Taproot, in which case it should be a Taproot address), cpfp, rbf. All should be checked for each address type, and for multiple address types combined (ie. send with utxos of different address types, open channel with inputs of different address types, boost txs with inputs of different address types, etc.)

@claude

This comment has been minimized.

@ben-kaufman
ben-kaufmanforce-pushed the feat/multiple-addresses-types branch from 919e450 to 8c8e243CompareFebruary 11, 2026 04:38
@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@jvsena42

This comment was marked as outdated.

@claude

This comment has been minimized.

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Could be the same/similar issue as here (synonymdev/bitkit-android#788 (comment)) but manifesting a bit differently. When trying to transfer max (in case when I have 25k on each address) sometimes I am not able to swipe to transfer (the GRAB element is locked, cannot be dragged). Note that transfering smaller amounts seems to work. Perhaps some coins selection fails in the background?

bitkit_logs_2026-02-26_14-52-13.zip

Screen.Recording.2026-02-26.at.15.47.05.mov

@ben-kaufman
ben-kaufman dismissed stale reviews from jvsena42 and pwltr via d0cd7b6February 27, 2026 00:29
@piotr-iohk

piotr-iohk commented Feb 27, 2026

Copy link
Copy Markdown
Collaborator

Encountered the issue again today (on revision d0cd7b6).

This time the spinner was spinning inifinitely after "dragging to transfer".
In the logs there is:

bitkit_logs_2026-02-27_12-57-14.zip

[2026-02-27 12:46:29.840 UTC] ERROR❌: Coin selection failed: Coin selection failed - [LDK] [ldk_node::wallet:922] [Logger.swift: log(record:) line: 177]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ldk-node error [Errors.swift: init(ldkError:) line: 416]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ServiceQueue: ldk [ServiceQueue.swift: background(_:_:functionName:) line: 51]
[2026-02-27 12:46:29.841 UTC] INFOℹ️: Normal coin selection failed, using sendAll: AppError(message: "Coin selection failed", debugMessage: Optional("Coin selection failed to find suitable UTXOs.")) [SpendingConfirm.swift: calculateTransactionFee() line: 214]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Selected UTXOs have insufficient value. Have: 100000sats, Need at least: 101000sats - [LDK] [ldk_node::wallet:978] [Logger.swift: log(record:) line: 177]

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similarly to synonymdev/bitkit-android#788 (comment)

  • each address funded with 10k = 40k total balance
  • send out 39k. (here it sends 40k not leaving dust, dust added to recipient)
  • trying to rbf such transaction = getting Toast error: "Bitkit was not able to boost"

bitkit_logs_2026-02-27_18-05-30.zip

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Makes sense though since you cannot RBF without having sufficient change or extra funds, so looks like correct behavior no?

@ovitrif
ovitrif requested a review from piotr-iohkMarch 2, 2026 10:15
@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similar as in Android (synonymdev/bitkit-android#788 (comment)), however here the legacy balance is not included when setting up external channel and trying to send max, however I guess the issue may be the fees?

  • each address has 25k
  • opening external channel sending max = 75k (legacy balance not included)
  • toast error: "Timeout waiting for channel pending event"

bitkit_logs_2026-03-02_13-25-07.zip

Screen.Recording.2026-03-02.at.14.23.04.mov

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

@piotr-iohk updated

@piotr-iohk

Copy link
Copy Markdown
Collaborator

There is a stacked PR running all e2e tests: #472.

For now change address check disabled in the tests. Waiting for synonymdev/ldk-node#72.

Comment thread.github/workflows/e2e_migration.yml
Comment thread.github/workflows/e2e_migration.yml

@piotr-iohkpiotr-iohk 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.

LGTM

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Is this good to merge? I suppose there are some unresolved comments.

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Resolved the 2 open comments

@piotr-iohk
piotr-iohk merged commit d0fdeb6 into masterMar 5, 2026
9 checks passed
@piotr-iohk
piotr-iohk deleted the feat/multiple-addresses-types branch March 5, 2026 11:22
@ovitrifovitrif added this to the 2.1.0 milestone Mar 9, 2026
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.

5 participants

@ben-kaufman@jvsena42@ovitrif@pwltr@piotr-iohk
, '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

feat: support all address types - #431

Merged
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types
Mar 5, 2026
Merged

feat: support all address types#431
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types

Conversation

@ben-kaufman

Copy link
Copy Markdown
Contributor

This PR adds support for multiple Bitcoin address types in the iOS app, allowing users to select and monitor different address formats. Users can select their preferred address type from: Legacy (P2PKH), Nested SegWit (P2SH-P2WPKH), Native SegWit (P2WPKH), and Taproot (P2TR).

This requires extensive testing across all functionalities, send, receive, channel open, channel close (funds should always go to native segwit address except when selected address when channel opened was Taproot, in which case it should be a Taproot address), cpfp, rbf. All should be checked for each address type, and for multiple address types combined (ie. send with utxos of different address types, open channel with inputs of different address types, boost txs with inputs of different address types, etc.)

@claude

This comment has been minimized.

@ben-kaufman
ben-kaufmanforce-pushed the feat/multiple-addresses-types branch from 919e450 to 8c8e243CompareFebruary 11, 2026 04:38
@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@jvsena42

This comment was marked as outdated.

@claude

This comment has been minimized.

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Could be the same/similar issue as here (synonymdev/bitkit-android#788 (comment)) but manifesting a bit differently. When trying to transfer max (in case when I have 25k on each address) sometimes I am not able to swipe to transfer (the GRAB element is locked, cannot be dragged). Note that transfering smaller amounts seems to work. Perhaps some coins selection fails in the background?

bitkit_logs_2026-02-26_14-52-13.zip

Screen.Recording.2026-02-26.at.15.47.05.mov

@ben-kaufman
ben-kaufman dismissed stale reviews from jvsena42 and pwltr via d0cd7b6February 27, 2026 00:29
@piotr-iohk

piotr-iohk commented Feb 27, 2026

Copy link
Copy Markdown
Collaborator

Encountered the issue again today (on revision d0cd7b6).

This time the spinner was spinning inifinitely after "dragging to transfer".
In the logs there is:

bitkit_logs_2026-02-27_12-57-14.zip

[2026-02-27 12:46:29.840 UTC] ERROR❌: Coin selection failed: Coin selection failed - [LDK] [ldk_node::wallet:922] [Logger.swift: log(record:) line: 177]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ldk-node error [Errors.swift: init(ldkError:) line: 416]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ServiceQueue: ldk [ServiceQueue.swift: background(_:_:functionName:) line: 51]
[2026-02-27 12:46:29.841 UTC] INFOℹ️: Normal coin selection failed, using sendAll: AppError(message: "Coin selection failed", debugMessage: Optional("Coin selection failed to find suitable UTXOs.")) [SpendingConfirm.swift: calculateTransactionFee() line: 214]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Selected UTXOs have insufficient value. Have: 100000sats, Need at least: 101000sats - [LDK] [ldk_node::wallet:978] [Logger.swift: log(record:) line: 177]

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similarly to synonymdev/bitkit-android#788 (comment)

  • each address funded with 10k = 40k total balance
  • send out 39k. (here it sends 40k not leaving dust, dust added to recipient)
  • trying to rbf such transaction = getting Toast error: "Bitkit was not able to boost"

bitkit_logs_2026-02-27_18-05-30.zip

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Makes sense though since you cannot RBF without having sufficient change or extra funds, so looks like correct behavior no?

@ovitrif
ovitrif requested a review from piotr-iohkMarch 2, 2026 10:15
@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similar as in Android (synonymdev/bitkit-android#788 (comment)), however here the legacy balance is not included when setting up external channel and trying to send max, however I guess the issue may be the fees?

  • each address has 25k
  • opening external channel sending max = 75k (legacy balance not included)
  • toast error: "Timeout waiting for channel pending event"

bitkit_logs_2026-03-02_13-25-07.zip

Screen.Recording.2026-03-02.at.14.23.04.mov

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

@piotr-iohk updated

@piotr-iohk

Copy link
Copy Markdown
Collaborator

There is a stacked PR running all e2e tests: #472.

For now change address check disabled in the tests. Waiting for synonymdev/ldk-node#72.

Comment thread.github/workflows/e2e_migration.yml
Comment thread.github/workflows/e2e_migration.yml

@piotr-iohkpiotr-iohk 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.

LGTM

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Is this good to merge? I suppose there are some unresolved comments.

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Resolved the 2 open comments

@piotr-iohk
piotr-iohk merged commit d0fdeb6 into masterMar 5, 2026
9 checks passed
@piotr-iohk
piotr-iohk deleted the feat/multiple-addresses-types branch March 5, 2026 11:22
@ovitrifovitrif added this to the 2.1.0 milestone Mar 9, 2026
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.

5 participants

@ben-kaufman@jvsena42@ovitrif@pwltr@piotr-iohk
, '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

feat: support all address types - #431

Merged
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types
Mar 5, 2026
Merged

feat: support all address types#431
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types

Conversation

@ben-kaufman

Copy link
Copy Markdown
Contributor

This PR adds support for multiple Bitcoin address types in the iOS app, allowing users to select and monitor different address formats. Users can select their preferred address type from: Legacy (P2PKH), Nested SegWit (P2SH-P2WPKH), Native SegWit (P2WPKH), and Taproot (P2TR).

This requires extensive testing across all functionalities, send, receive, channel open, channel close (funds should always go to native segwit address except when selected address when channel opened was Taproot, in which case it should be a Taproot address), cpfp, rbf. All should be checked for each address type, and for multiple address types combined (ie. send with utxos of different address types, open channel with inputs of different address types, boost txs with inputs of different address types, etc.)

@claude

This comment has been minimized.

@ben-kaufman
ben-kaufmanforce-pushed the feat/multiple-addresses-types branch from 919e450 to 8c8e243CompareFebruary 11, 2026 04:38
@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@jvsena42

This comment was marked as outdated.

@claude

This comment has been minimized.

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Could be the same/similar issue as here (synonymdev/bitkit-android#788 (comment)) but manifesting a bit differently. When trying to transfer max (in case when I have 25k on each address) sometimes I am not able to swipe to transfer (the GRAB element is locked, cannot be dragged). Note that transfering smaller amounts seems to work. Perhaps some coins selection fails in the background?

bitkit_logs_2026-02-26_14-52-13.zip

Screen.Recording.2026-02-26.at.15.47.05.mov

@ben-kaufman
ben-kaufman dismissed stale reviews from jvsena42 and pwltr via d0cd7b6February 27, 2026 00:29
@piotr-iohk

piotr-iohk commented Feb 27, 2026

Copy link
Copy Markdown
Collaborator

Encountered the issue again today (on revision d0cd7b6).

This time the spinner was spinning inifinitely after "dragging to transfer".
In the logs there is:

bitkit_logs_2026-02-27_12-57-14.zip

[2026-02-27 12:46:29.840 UTC] ERROR❌: Coin selection failed: Coin selection failed - [LDK] [ldk_node::wallet:922] [Logger.swift: log(record:) line: 177]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ldk-node error [Errors.swift: init(ldkError:) line: 416]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ServiceQueue: ldk [ServiceQueue.swift: background(_:_:functionName:) line: 51]
[2026-02-27 12:46:29.841 UTC] INFOℹ️: Normal coin selection failed, using sendAll: AppError(message: "Coin selection failed", debugMessage: Optional("Coin selection failed to find suitable UTXOs.")) [SpendingConfirm.swift: calculateTransactionFee() line: 214]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Selected UTXOs have insufficient value. Have: 100000sats, Need at least: 101000sats - [LDK] [ldk_node::wallet:978] [Logger.swift: log(record:) line: 177]

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similarly to synonymdev/bitkit-android#788 (comment)

  • each address funded with 10k = 40k total balance
  • send out 39k. (here it sends 40k not leaving dust, dust added to recipient)
  • trying to rbf such transaction = getting Toast error: "Bitkit was not able to boost"

bitkit_logs_2026-02-27_18-05-30.zip

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Makes sense though since you cannot RBF without having sufficient change or extra funds, so looks like correct behavior no?

@ovitrif
ovitrif requested a review from piotr-iohkMarch 2, 2026 10:15
@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similar as in Android (synonymdev/bitkit-android#788 (comment)), however here the legacy balance is not included when setting up external channel and trying to send max, however I guess the issue may be the fees?

  • each address has 25k
  • opening external channel sending max = 75k (legacy balance not included)
  • toast error: "Timeout waiting for channel pending event"

bitkit_logs_2026-03-02_13-25-07.zip

Screen.Recording.2026-03-02.at.14.23.04.mov

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

@piotr-iohk updated

@piotr-iohk

Copy link
Copy Markdown
Collaborator

There is a stacked PR running all e2e tests: #472.

For now change address check disabled in the tests. Waiting for synonymdev/ldk-node#72.

Comment thread.github/workflows/e2e_migration.yml
Comment thread.github/workflows/e2e_migration.yml

@piotr-iohkpiotr-iohk 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.

LGTM

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Is this good to merge? I suppose there are some unresolved comments.

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Resolved the 2 open comments

@piotr-iohk
piotr-iohk merged commit d0fdeb6 into masterMar 5, 2026
9 checks passed
@piotr-iohk
piotr-iohk deleted the feat/multiple-addresses-types branch March 5, 2026 11:22
@ovitrifovitrif added this to the 2.1.0 milestone Mar 9, 2026
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.

5 participants

@ben-kaufman@jvsena42@ovitrif@pwltr@piotr-iohk
, '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

feat: support all address types - #431

Merged
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types
Mar 5, 2026
Merged

feat: support all address types#431
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types

Conversation

@ben-kaufman

Copy link
Copy Markdown
Contributor

This PR adds support for multiple Bitcoin address types in the iOS app, allowing users to select and monitor different address formats. Users can select their preferred address type from: Legacy (P2PKH), Nested SegWit (P2SH-P2WPKH), Native SegWit (P2WPKH), and Taproot (P2TR).

This requires extensive testing across all functionalities, send, receive, channel open, channel close (funds should always go to native segwit address except when selected address when channel opened was Taproot, in which case it should be a Taproot address), cpfp, rbf. All should be checked for each address type, and for multiple address types combined (ie. send with utxos of different address types, open channel with inputs of different address types, boost txs with inputs of different address types, etc.)

@claude

This comment has been minimized.

@ben-kaufman
ben-kaufmanforce-pushed the feat/multiple-addresses-types branch from 919e450 to 8c8e243CompareFebruary 11, 2026 04:38
@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@jvsena42

This comment was marked as outdated.

@claude

This comment has been minimized.

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Could be the same/similar issue as here (synonymdev/bitkit-android#788 (comment)) but manifesting a bit differently. When trying to transfer max (in case when I have 25k on each address) sometimes I am not able to swipe to transfer (the GRAB element is locked, cannot be dragged). Note that transfering smaller amounts seems to work. Perhaps some coins selection fails in the background?

bitkit_logs_2026-02-26_14-52-13.zip

Screen.Recording.2026-02-26.at.15.47.05.mov

@ben-kaufman
ben-kaufman dismissed stale reviews from jvsena42 and pwltr via d0cd7b6February 27, 2026 00:29
@piotr-iohk

piotr-iohk commented Feb 27, 2026

Copy link
Copy Markdown
Collaborator

Encountered the issue again today (on revision d0cd7b6).

This time the spinner was spinning inifinitely after "dragging to transfer".
In the logs there is:

bitkit_logs_2026-02-27_12-57-14.zip

[2026-02-27 12:46:29.840 UTC] ERROR❌: Coin selection failed: Coin selection failed - [LDK] [ldk_node::wallet:922] [Logger.swift: log(record:) line: 177]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ldk-node error [Errors.swift: init(ldkError:) line: 416]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ServiceQueue: ldk [ServiceQueue.swift: background(_:_:functionName:) line: 51]
[2026-02-27 12:46:29.841 UTC] INFOℹ️: Normal coin selection failed, using sendAll: AppError(message: "Coin selection failed", debugMessage: Optional("Coin selection failed to find suitable UTXOs.")) [SpendingConfirm.swift: calculateTransactionFee() line: 214]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Selected UTXOs have insufficient value. Have: 100000sats, Need at least: 101000sats - [LDK] [ldk_node::wallet:978] [Logger.swift: log(record:) line: 177]

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similarly to synonymdev/bitkit-android#788 (comment)

  • each address funded with 10k = 40k total balance
  • send out 39k. (here it sends 40k not leaving dust, dust added to recipient)
  • trying to rbf such transaction = getting Toast error: "Bitkit was not able to boost"

bitkit_logs_2026-02-27_18-05-30.zip

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Makes sense though since you cannot RBF without having sufficient change or extra funds, so looks like correct behavior no?

@ovitrif
ovitrif requested a review from piotr-iohkMarch 2, 2026 10:15
@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similar as in Android (synonymdev/bitkit-android#788 (comment)), however here the legacy balance is not included when setting up external channel and trying to send max, however I guess the issue may be the fees?

  • each address has 25k
  • opening external channel sending max = 75k (legacy balance not included)
  • toast error: "Timeout waiting for channel pending event"

bitkit_logs_2026-03-02_13-25-07.zip

Screen.Recording.2026-03-02.at.14.23.04.mov

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

@piotr-iohk updated

@piotr-iohk

Copy link
Copy Markdown
Collaborator

There is a stacked PR running all e2e tests: #472.

For now change address check disabled in the tests. Waiting for synonymdev/ldk-node#72.

Comment thread.github/workflows/e2e_migration.yml
Comment thread.github/workflows/e2e_migration.yml

@piotr-iohkpiotr-iohk 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.

LGTM

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Is this good to merge? I suppose there are some unresolved comments.

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Resolved the 2 open comments

@piotr-iohk
piotr-iohk merged commit d0fdeb6 into masterMar 5, 2026
9 checks passed
@piotr-iohk
piotr-iohk deleted the feat/multiple-addresses-types branch March 5, 2026 11:22
@ovitrifovitrif added this to the 2.1.0 milestone Mar 9, 2026
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.

5 participants

@ben-kaufman@jvsena42@ovitrif@pwltr@piotr-iohk
, '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

feat: support all address types - #431

Merged
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types
Mar 5, 2026
Merged

feat: support all address types#431
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types

Conversation

@ben-kaufman

Copy link
Copy Markdown
Contributor

This PR adds support for multiple Bitcoin address types in the iOS app, allowing users to select and monitor different address formats. Users can select their preferred address type from: Legacy (P2PKH), Nested SegWit (P2SH-P2WPKH), Native SegWit (P2WPKH), and Taproot (P2TR).

This requires extensive testing across all functionalities, send, receive, channel open, channel close (funds should always go to native segwit address except when selected address when channel opened was Taproot, in which case it should be a Taproot address), cpfp, rbf. All should be checked for each address type, and for multiple address types combined (ie. send with utxos of different address types, open channel with inputs of different address types, boost txs with inputs of different address types, etc.)

@claude

This comment has been minimized.

@ben-kaufman
ben-kaufmanforce-pushed the feat/multiple-addresses-types branch from 919e450 to 8c8e243CompareFebruary 11, 2026 04:38
@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@jvsena42

This comment was marked as outdated.

@claude

This comment has been minimized.

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Could be the same/similar issue as here (synonymdev/bitkit-android#788 (comment)) but manifesting a bit differently. When trying to transfer max (in case when I have 25k on each address) sometimes I am not able to swipe to transfer (the GRAB element is locked, cannot be dragged). Note that transfering smaller amounts seems to work. Perhaps some coins selection fails in the background?

bitkit_logs_2026-02-26_14-52-13.zip

Screen.Recording.2026-02-26.at.15.47.05.mov

@ben-kaufman
ben-kaufman dismissed stale reviews from jvsena42 and pwltr via d0cd7b6February 27, 2026 00:29
@piotr-iohk

piotr-iohk commented Feb 27, 2026

Copy link
Copy Markdown
Collaborator

Encountered the issue again today (on revision d0cd7b6).

This time the spinner was spinning inifinitely after "dragging to transfer".
In the logs there is:

bitkit_logs_2026-02-27_12-57-14.zip

[2026-02-27 12:46:29.840 UTC] ERROR❌: Coin selection failed: Coin selection failed - [LDK] [ldk_node::wallet:922] [Logger.swift: log(record:) line: 177]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ldk-node error [Errors.swift: init(ldkError:) line: 416]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ServiceQueue: ldk [ServiceQueue.swift: background(_:_:functionName:) line: 51]
[2026-02-27 12:46:29.841 UTC] INFOℹ️: Normal coin selection failed, using sendAll: AppError(message: "Coin selection failed", debugMessage: Optional("Coin selection failed to find suitable UTXOs.")) [SpendingConfirm.swift: calculateTransactionFee() line: 214]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Selected UTXOs have insufficient value. Have: 100000sats, Need at least: 101000sats - [LDK] [ldk_node::wallet:978] [Logger.swift: log(record:) line: 177]

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similarly to synonymdev/bitkit-android#788 (comment)

  • each address funded with 10k = 40k total balance
  • send out 39k. (here it sends 40k not leaving dust, dust added to recipient)
  • trying to rbf such transaction = getting Toast error: "Bitkit was not able to boost"

bitkit_logs_2026-02-27_18-05-30.zip

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Makes sense though since you cannot RBF without having sufficient change or extra funds, so looks like correct behavior no?

@ovitrif
ovitrif requested a review from piotr-iohkMarch 2, 2026 10:15
@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similar as in Android (synonymdev/bitkit-android#788 (comment)), however here the legacy balance is not included when setting up external channel and trying to send max, however I guess the issue may be the fees?

  • each address has 25k
  • opening external channel sending max = 75k (legacy balance not included)
  • toast error: "Timeout waiting for channel pending event"

bitkit_logs_2026-03-02_13-25-07.zip

Screen.Recording.2026-03-02.at.14.23.04.mov

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

@piotr-iohk updated

@piotr-iohk

Copy link
Copy Markdown
Collaborator

There is a stacked PR running all e2e tests: #472.

For now change address check disabled in the tests. Waiting for synonymdev/ldk-node#72.

Comment thread.github/workflows/e2e_migration.yml
Comment thread.github/workflows/e2e_migration.yml

@piotr-iohkpiotr-iohk 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.

LGTM

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Is this good to merge? I suppose there are some unresolved comments.

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Resolved the 2 open comments

@piotr-iohk
piotr-iohk merged commit d0fdeb6 into masterMar 5, 2026
9 checks passed
@piotr-iohk
piotr-iohk deleted the feat/multiple-addresses-types branch March 5, 2026 11:22
@ovitrifovitrif added this to the 2.1.0 milestone Mar 9, 2026
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.

5 participants

@ben-kaufman@jvsena42@ovitrif@pwltr@piotr-iohk
, '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

feat: support all address types - #431

Merged
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types
Mar 5, 2026
Merged

feat: support all address types#431
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types

Conversation

@ben-kaufman

Copy link
Copy Markdown
Contributor

This PR adds support for multiple Bitcoin address types in the iOS app, allowing users to select and monitor different address formats. Users can select their preferred address type from: Legacy (P2PKH), Nested SegWit (P2SH-P2WPKH), Native SegWit (P2WPKH), and Taproot (P2TR).

This requires extensive testing across all functionalities, send, receive, channel open, channel close (funds should always go to native segwit address except when selected address when channel opened was Taproot, in which case it should be a Taproot address), cpfp, rbf. All should be checked for each address type, and for multiple address types combined (ie. send with utxos of different address types, open channel with inputs of different address types, boost txs with inputs of different address types, etc.)

@claude

This comment has been minimized.

@ben-kaufman
ben-kaufmanforce-pushed the feat/multiple-addresses-types branch from 919e450 to 8c8e243CompareFebruary 11, 2026 04:38
@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@jvsena42

This comment was marked as outdated.

@claude

This comment has been minimized.

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Could be the same/similar issue as here (synonymdev/bitkit-android#788 (comment)) but manifesting a bit differently. When trying to transfer max (in case when I have 25k on each address) sometimes I am not able to swipe to transfer (the GRAB element is locked, cannot be dragged). Note that transfering smaller amounts seems to work. Perhaps some coins selection fails in the background?

bitkit_logs_2026-02-26_14-52-13.zip

Screen.Recording.2026-02-26.at.15.47.05.mov

@ben-kaufman
ben-kaufman dismissed stale reviews from jvsena42 and pwltr via d0cd7b6February 27, 2026 00:29
@piotr-iohk

piotr-iohk commented Feb 27, 2026

Copy link
Copy Markdown
Collaborator

Encountered the issue again today (on revision d0cd7b6).

This time the spinner was spinning inifinitely after "dragging to transfer".
In the logs there is:

bitkit_logs_2026-02-27_12-57-14.zip

[2026-02-27 12:46:29.840 UTC] ERROR❌: Coin selection failed: Coin selection failed - [LDK] [ldk_node::wallet:922] [Logger.swift: log(record:) line: 177]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ldk-node error [Errors.swift: init(ldkError:) line: 416]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ServiceQueue: ldk [ServiceQueue.swift: background(_:_:functionName:) line: 51]
[2026-02-27 12:46:29.841 UTC] INFOℹ️: Normal coin selection failed, using sendAll: AppError(message: "Coin selection failed", debugMessage: Optional("Coin selection failed to find suitable UTXOs.")) [SpendingConfirm.swift: calculateTransactionFee() line: 214]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Selected UTXOs have insufficient value. Have: 100000sats, Need at least: 101000sats - [LDK] [ldk_node::wallet:978] [Logger.swift: log(record:) line: 177]

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similarly to synonymdev/bitkit-android#788 (comment)

  • each address funded with 10k = 40k total balance
  • send out 39k. (here it sends 40k not leaving dust, dust added to recipient)
  • trying to rbf such transaction = getting Toast error: "Bitkit was not able to boost"

bitkit_logs_2026-02-27_18-05-30.zip

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Makes sense though since you cannot RBF without having sufficient change or extra funds, so looks like correct behavior no?

@ovitrif
ovitrif requested a review from piotr-iohkMarch 2, 2026 10:15
@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similar as in Android (synonymdev/bitkit-android#788 (comment)), however here the legacy balance is not included when setting up external channel and trying to send max, however I guess the issue may be the fees?

  • each address has 25k
  • opening external channel sending max = 75k (legacy balance not included)
  • toast error: "Timeout waiting for channel pending event"

bitkit_logs_2026-03-02_13-25-07.zip

Screen.Recording.2026-03-02.at.14.23.04.mov

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

@piotr-iohk updated

@piotr-iohk

Copy link
Copy Markdown
Collaborator

There is a stacked PR running all e2e tests: #472.

For now change address check disabled in the tests. Waiting for synonymdev/ldk-node#72.

Comment thread.github/workflows/e2e_migration.yml
Comment thread.github/workflows/e2e_migration.yml

@piotr-iohkpiotr-iohk 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.

LGTM

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Is this good to merge? I suppose there are some unresolved comments.

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Resolved the 2 open comments

@piotr-iohk
piotr-iohk merged commit d0fdeb6 into masterMar 5, 2026
9 checks passed
@piotr-iohk
piotr-iohk deleted the feat/multiple-addresses-types branch March 5, 2026 11:22
@ovitrifovitrif added this to the 2.1.0 milestone Mar 9, 2026
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.

5 participants

@ben-kaufman@jvsena42@ovitrif@pwltr@piotr-iohk
, '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

feat: support all address types - #431

Merged
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types
Mar 5, 2026
Merged

feat: support all address types#431
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types

Conversation

@ben-kaufman

Copy link
Copy Markdown
Contributor

This PR adds support for multiple Bitcoin address types in the iOS app, allowing users to select and monitor different address formats. Users can select their preferred address type from: Legacy (P2PKH), Nested SegWit (P2SH-P2WPKH), Native SegWit (P2WPKH), and Taproot (P2TR).

This requires extensive testing across all functionalities, send, receive, channel open, channel close (funds should always go to native segwit address except when selected address when channel opened was Taproot, in which case it should be a Taproot address), cpfp, rbf. All should be checked for each address type, and for multiple address types combined (ie. send with utxos of different address types, open channel with inputs of different address types, boost txs with inputs of different address types, etc.)

@claude

This comment has been minimized.

@ben-kaufman
ben-kaufmanforce-pushed the feat/multiple-addresses-types branch from 919e450 to 8c8e243CompareFebruary 11, 2026 04:38
@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@jvsena42

This comment was marked as outdated.

@claude

This comment has been minimized.

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Could be the same/similar issue as here (synonymdev/bitkit-android#788 (comment)) but manifesting a bit differently. When trying to transfer max (in case when I have 25k on each address) sometimes I am not able to swipe to transfer (the GRAB element is locked, cannot be dragged). Note that transfering smaller amounts seems to work. Perhaps some coins selection fails in the background?

bitkit_logs_2026-02-26_14-52-13.zip

Screen.Recording.2026-02-26.at.15.47.05.mov

@ben-kaufman
ben-kaufman dismissed stale reviews from jvsena42 and pwltr via d0cd7b6February 27, 2026 00:29
@piotr-iohk

piotr-iohk commented Feb 27, 2026

Copy link
Copy Markdown
Collaborator

Encountered the issue again today (on revision d0cd7b6).

This time the spinner was spinning inifinitely after "dragging to transfer".
In the logs there is:

bitkit_logs_2026-02-27_12-57-14.zip

[2026-02-27 12:46:29.840 UTC] ERROR❌: Coin selection failed: Coin selection failed - [LDK] [ldk_node::wallet:922] [Logger.swift: log(record:) line: 177]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ldk-node error [Errors.swift: init(ldkError:) line: 416]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ServiceQueue: ldk [ServiceQueue.swift: background(_:_:functionName:) line: 51]
[2026-02-27 12:46:29.841 UTC] INFOℹ️: Normal coin selection failed, using sendAll: AppError(message: "Coin selection failed", debugMessage: Optional("Coin selection failed to find suitable UTXOs.")) [SpendingConfirm.swift: calculateTransactionFee() line: 214]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Selected UTXOs have insufficient value. Have: 100000sats, Need at least: 101000sats - [LDK] [ldk_node::wallet:978] [Logger.swift: log(record:) line: 177]

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similarly to synonymdev/bitkit-android#788 (comment)

  • each address funded with 10k = 40k total balance
  • send out 39k. (here it sends 40k not leaving dust, dust added to recipient)
  • trying to rbf such transaction = getting Toast error: "Bitkit was not able to boost"

bitkit_logs_2026-02-27_18-05-30.zip

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Makes sense though since you cannot RBF without having sufficient change or extra funds, so looks like correct behavior no?

@ovitrif
ovitrif requested a review from piotr-iohkMarch 2, 2026 10:15
@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similar as in Android (synonymdev/bitkit-android#788 (comment)), however here the legacy balance is not included when setting up external channel and trying to send max, however I guess the issue may be the fees?

  • each address has 25k
  • opening external channel sending max = 75k (legacy balance not included)
  • toast error: "Timeout waiting for channel pending event"

bitkit_logs_2026-03-02_13-25-07.zip

Screen.Recording.2026-03-02.at.14.23.04.mov

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

@piotr-iohk updated

@piotr-iohk

Copy link
Copy Markdown
Collaborator

There is a stacked PR running all e2e tests: #472.

For now change address check disabled in the tests. Waiting for synonymdev/ldk-node#72.

Comment thread.github/workflows/e2e_migration.yml
Comment thread.github/workflows/e2e_migration.yml

@piotr-iohkpiotr-iohk 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.

LGTM

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Is this good to merge? I suppose there are some unresolved comments.

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Resolved the 2 open comments

@piotr-iohk
piotr-iohk merged commit d0fdeb6 into masterMar 5, 2026
9 checks passed
@piotr-iohk
piotr-iohk deleted the feat/multiple-addresses-types branch March 5, 2026 11:22
@ovitrifovitrif added this to the 2.1.0 milestone Mar 9, 2026
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.

5 participants

@ben-kaufman@jvsena42@ovitrif@pwltr@piotr-iohk
, '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

feat: support all address types - #431

Merged
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types
Mar 5, 2026
Merged

feat: support all address types#431
piotr-iohk merged 51 commits into
masterfrom
feat/multiple-addresses-types

Conversation

@ben-kaufman

Copy link
Copy Markdown
Contributor

This PR adds support for multiple Bitcoin address types in the iOS app, allowing users to select and monitor different address formats. Users can select their preferred address type from: Legacy (P2PKH), Nested SegWit (P2SH-P2WPKH), Native SegWit (P2WPKH), and Taproot (P2TR).

This requires extensive testing across all functionalities, send, receive, channel open, channel close (funds should always go to native segwit address except when selected address when channel opened was Taproot, in which case it should be a Taproot address), cpfp, rbf. All should be checked for each address type, and for multiple address types combined (ie. send with utxos of different address types, open channel with inputs of different address types, boost txs with inputs of different address types, etc.)

@claude

This comment has been minimized.

@ben-kaufman
ben-kaufmanforce-pushed the feat/multiple-addresses-types branch from 919e450 to 8c8e243CompareFebruary 11, 2026 04:38
@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@claude

This comment has been minimized.

@jvsena42

This comment was marked as outdated.

@claude

This comment has been minimized.

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Could be the same/similar issue as here (synonymdev/bitkit-android#788 (comment)) but manifesting a bit differently. When trying to transfer max (in case when I have 25k on each address) sometimes I am not able to swipe to transfer (the GRAB element is locked, cannot be dragged). Note that transfering smaller amounts seems to work. Perhaps some coins selection fails in the background?

bitkit_logs_2026-02-26_14-52-13.zip

Screen.Recording.2026-02-26.at.15.47.05.mov

@ben-kaufman
ben-kaufman dismissed stale reviews from jvsena42 and pwltr via d0cd7b6February 27, 2026 00:29
@piotr-iohk

piotr-iohk commented Feb 27, 2026

Copy link
Copy Markdown
Collaborator

Encountered the issue again today (on revision d0cd7b6).

This time the spinner was spinning inifinitely after "dragging to transfer".
In the logs there is:

bitkit_logs_2026-02-27_12-57-14.zip

[2026-02-27 12:46:29.840 UTC] ERROR❌: Coin selection failed: Coin selection failed - [LDK] [ldk_node::wallet:922] [Logger.swift: log(record:) line: 177]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ldk-node error [Errors.swift: init(ldkError:) line: 416]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Coin selection failed [Coin selection failed to find suitable UTXOs.] - ServiceQueue: ldk [ServiceQueue.swift: background(_:_:functionName:) line: 51]
[2026-02-27 12:46:29.841 UTC] INFOℹ️: Normal coin selection failed, using sendAll: AppError(message: "Coin selection failed", debugMessage: Optional("Coin selection failed to find suitable UTXOs.")) [SpendingConfirm.swift: calculateTransactionFee() line: 214]
[2026-02-27 12:46:29.841 UTC] ERROR❌: Selected UTXOs have insufficient value. Have: 100000sats, Need at least: 101000sats - [LDK] [ldk_node::wallet:978] [Logger.swift: log(record:) line: 177]

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similarly to synonymdev/bitkit-android#788 (comment)

  • each address funded with 10k = 40k total balance
  • send out 39k. (here it sends 40k not leaving dust, dust added to recipient)
  • trying to rbf such transaction = getting Toast error: "Bitkit was not able to boost"

bitkit_logs_2026-02-27_18-05-30.zip

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Makes sense though since you cannot RBF without having sufficient change or extra funds, so looks like correct behavior no?

@ovitrif
ovitrif requested a review from piotr-iohkMarch 2, 2026 10:15
@piotr-iohk

Copy link
Copy Markdown
Collaborator

Similar as in Android (synonymdev/bitkit-android#788 (comment)), however here the legacy balance is not included when setting up external channel and trying to send max, however I guess the issue may be the fees?

  • each address has 25k
  • opening external channel sending max = 75k (legacy balance not included)
  • toast error: "Timeout waiting for channel pending event"

bitkit_logs_2026-03-02_13-25-07.zip

Screen.Recording.2026-03-02.at.14.23.04.mov

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

@piotr-iohk updated

@piotr-iohk

Copy link
Copy Markdown
Collaborator

There is a stacked PR running all e2e tests: #472.

For now change address check disabled in the tests. Waiting for synonymdev/ldk-node#72.

Comment thread.github/workflows/e2e_migration.yml
Comment thread.github/workflows/e2e_migration.yml

@piotr-iohkpiotr-iohk 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.

LGTM

@piotr-iohk

Copy link
Copy Markdown
Collaborator

Is this good to merge? I suppose there are some unresolved comments.

@ben-kaufman

Copy link
Copy Markdown
ContributorAuthor

Resolved the 2 open comments

@piotr-iohk
piotr-iohk merged commit d0fdeb6 into masterMar 5, 2026
9 checks passed
@piotr-iohk
piotr-iohk deleted the feat/multiple-addresses-types branch March 5, 2026 11:22
@ovitrifovitrif added this to the 2.1.0 milestone Mar 9, 2026
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.

5 participants

@ben-kaufman@jvsena42@ovitrif@pwltr@piotr-iohk