Skip to content
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
f111b85
feat: support all address types
ben-kaufman Feb 18, 2026
d9d7c6d
Replace node restart with dynamic address type APIs
ben-kaufman Feb 18, 2026
f9b812d
update ldk-node
ben-kaufman Feb 18, 2026
8738aeb
remove fee buffer
ben-kaufman Feb 18, 2026
cb76204
Merge branch 'feat/multiple-addresses-types' into refactor/dynamic-ad…
ben-kaufman Feb 18, 2026
87d977c
fix transfer max to savings
ben-kaufman Feb 18, 2026
2480b36
Increase tests
ben-kaufman Feb 19, 2026
e11f4a2
Update ldk-node
ben-kaufman Feb 20, 2026
e92b519
Merge pull request #789 from synonymdev/refactor/dynamic-address-type…
ben-kaufman Feb 20, 2026
19d91a0
Merge branch 'master' into feat/multiple-addresses-types
ben-kaufman Feb 20, 2026
58d16aa
toast test ids
piotr-iohk Feb 20, 2026
8cfab11
fixes
ben-kaufman Feb 24, 2026
81b1b95
suppress LongParameterList
ben-kaufman Feb 24, 2026
e1d14f9
fix test
ben-kaufman Feb 24, 2026
f3e10d7
fix test
ben-kaufman Feb 24, 2026
f398725
Update ldk-node
ben-kaufman Feb 25, 2026
3bd89a9
Merge branch 'master' into feat/multiple-addresses-types
ben-kaufman Feb 25, 2026
9b0635b
Fix ldk node package name
ben-kaufman Feb 25, 2026
bf46211
Update libs.versions.toml
ben-kaufman Feb 25, 2026
4ddd5f5
Merge branch 'master' into feat/multiple-addresses-types
ben-kaufman Feb 25, 2026
6308576
fix issues
ben-kaufman Feb 26, 2026
b143972
Merge branch 'master' into feat/multiple-addresses-types
ben-kaufman Feb 27, 2026
1c3bad5
fixes
ben-kaufman Mar 2, 2026
48e2db1
Merge branch 'master' into feat/multiple-addresses-types
ben-kaufman Mar 2, 2026
486486c
fix tests
ben-kaufman Mar 2, 2026
9c03667
fix max channel open balance
ben-kaufman Mar 2, 2026
3ddae7b
fix max amount for channel open
ben-kaufman Mar 2, 2026
a6aa908
Merge branch 'master' into feat/multiple-addresses-types
ben-kaufman Mar 3, 2026
53533d0
fix balance issue and add logs
ben-kaufman Mar 3, 2026
f5171fa
disable type selection while loading
ben-kaufman Mar 3, 2026
57f3c95
test multiple addresses
piotr-iohk Mar 3, 2026
beb41b4
run flow on re-open
piotr-iohk Mar 3, 2026
88bde02
Update MigrationService.kt
ben-kaufman Mar 4, 2026
2e78359
fix: add @Immutable to AddressTypePreferenceUiState to fix Compose st…
ben-kaufman Mar 4, 2026
2331293
Merge remote-tracking branch 'origin/master' into feat/multiple-addre…
ben-kaufman Mar 4, 2026
09b2bd8
Delete SweepPromptSheet.kt
ben-kaufman Mar 4, 2026
a42d7a8
migration fixes
ben-kaufman Mar 4, 2026
ffd32ed
Add migration_4 scenario to e2e migration workflow
ben-kaufman Mar 4, 2026
aad545d
Merge pull request #820 from synonymdev/test/multiple-addresses-types
ovitrif Mar 4, 2026
f76fc40
Merge branch 'master' into feat/multiple-addresses-types
ovitrif Mar 4, 2026
903b24a
rename -regtest => -staging
piotr-iohk Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/workflows/e2e_migration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ jobs:
- { name: migration_1-restore, grep: "@migration_1" }
- { name: migration_2-migration, grep: "@migration_2" }
- { name: migration_3-with-passphrase, grep: "@migration_3" }
- { name: migration_4-with-sweep, grep: "@migration_4" }
Comment thread
piotr-iohk marked this conversation as resolved.

name: e2e-tests - ${{ matrix.rn_version }} - ${{ matrix.scenario.name }}

Expand Down
15 changes: 14 additions & 1 deletion app/src/main/java/to/bitkit/data/SettingsStore.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,21 @@ class SettingsStore @Inject constructor(

val data: Flow<SettingsData> = store.data

@Volatile
Comment thread
jvsena42 marked this conversation as resolved.
var restoredMonitoredTypesFromBackup: Boolean = false
private set

suspend fun restoreFromBackup(payload: SettingsBackupV1) =
runCatching {
val data = payload.settings.resetPin()
store.updateData { data }

val monitored = data.addressTypesToMonitor
val selected = data.selectedAddressType
restoredMonitoredTypesFromBackup = monitored.size > 1 ||
(monitored.size == 1 && monitored.first() != selected)
}.onSuccess {
Logger.debug("Restored settings", TAG)
Logger.debug("Restored settings, monitoredFromBackup=$restoredMonitoredTypesFromBackup", context = TAG)
}

suspend fun update(transform: (SettingsData) -> SettingsData) {
Expand Down Expand Up @@ -66,6 +75,7 @@ class SettingsStore @Inject constructor(

suspend fun reset() {
store.updateData { SettingsData() }
restoredMonitoredTypesFromBackup = false
Logger.info("Deleted all user settings data.")
}

Expand Down Expand Up @@ -117,6 +127,9 @@ data class SettingsData(
val coinSelectPreference: CoinSelectionPreference = CoinSelectionPreference.BranchAndBound,
val electrumServer: String = Env.electrumServerUrl,
val rgsServerUrl: String? = Env.ldkRgsServerUrl,
val selectedAddressType: String = "nativeSegwit",
val addressTypesToMonitor: List<String> = listOf("nativeSegwit"),
val pendingRestoreAddressTypePrune: Boolean = false,
Comment thread
ovitrif marked this conversation as resolved.
Outdated
)

fun SettingsData.resetPin() = this.copy(
Expand Down
48 changes: 42 additions & 6 deletions app/src/main/java/to/bitkit/models/AddressType.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ data class AddressTypeInfo(
val shortName: String,
val description: String,
val example: String,
val shortExample: String,
)

@Suppress("unused")
Expand All @@ -20,32 +21,36 @@ fun AddressType.addressTypeInfo(): AddressTypeInfo = when (this) {
path = "m/86'/0'/0'/0/0",
name = "Taproot",
shortName = "Taproot",
description = "Taproot Address",
description = "Pay-to-Taproot (bc1px...)",
example = "(bc1px...)",
shortExample = "bc1p...",
)

AddressType.P2WPKH -> AddressTypeInfo(
path = "m/84'/0'/0'/0/0",
name = "Native Segwit Bech32",
shortName = "Native Segwit",
description = "Pay-to-witness-public-key-hash",
example = "(bc1x...)",
description = "Pay-to-witness-public-key-hash (bc1q...)",
example = "(bc1q...)",
shortExample = "bc1q...",
)

AddressType.P2SH -> AddressTypeInfo(
path = "m/49'/0'/0'/0/0",
name = "Nested Segwit",
shortName = "Segwit",
description = "Pay-to-Script-Hash",
shortName = "Nested Segwit",
description = "Pay-to-Script-Hash (3x...)",
example = "(3x...)",
shortExample = "3x...",
)

AddressType.P2PKH -> AddressTypeInfo(
path = "m/44'/0'/0'/0/0",
name = "Legacy",
shortName = "Legacy",
description = "Pay-to-public-key-hash",
description = "Pay-to-public-key-hash (1x...)",
example = "(1x...)",
shortExample = "1x...",
)

else -> AddressTypeInfo(
Expand All @@ -54,6 +59,7 @@ fun AddressType.addressTypeInfo(): AddressTypeInfo = when (this) {
shortName = "Unknown",
description = "Unknown",
example = "",
shortExample = "",
)
}

Expand All @@ -80,3 +86,33 @@ fun AddressType.toDerivationPath(
else -> ""
}
}

fun AddressType.toSettingsString(): String = when (this) {
AddressType.P2TR -> "taproot"
AddressType.P2WPKH -> "nativeSegwit"
AddressType.P2SH -> "nestedSegwit"
AddressType.P2PKH -> "legacy"
else -> "nativeSegwit"
}

fun String.toAddressType(): AddressType? = when (this) {
"taproot" -> AddressType.P2TR
"nativeSegwit" -> AddressType.P2WPKH
"nestedSegwit" -> AddressType.P2SH
"legacy" -> AddressType.P2PKH
else -> null
}

val ALL_ADDRESS_TYPES = listOf(AddressType.P2PKH, AddressType.P2SH, AddressType.P2WPKH, AddressType.P2TR)

val ALL_ADDRESS_TYPE_STRINGS = ALL_ADDRESS_TYPES.map { it.toSettingsString() }

val NATIVE_WITNESS_TYPES = setOf(AddressType.P2WPKH, AddressType.P2TR)

fun String.addressTypeFromAddress(): String? = when {
startsWith("bc1p") || startsWith("tb1p") || startsWith("bcrt1p") -> "taproot"
startsWith("bc1") || startsWith("tb1") || startsWith("bcrt1") -> "nativeSegwit"
startsWith("3") || startsWith("2") -> "nestedSegwit"
startsWith("1") || startsWith("m") || startsWith("n") -> "legacy"
else -> null
}
1 change: 1 addition & 0 deletions app/src/main/java/to/bitkit/models/BalanceState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import kotlinx.serialization.Serializable
@Serializable
data class BalanceState(
val totalOnchainSats: ULong = 0uL,
val channelFundableBalance: ULong = 0uL,
val totalLightningSats: ULong = 0uL,
val maxSendLightningSats: ULong = 0uL, // Without account routing fees
val maxSendOnchainSats: ULong = 0uL,
Expand Down
Loading
Loading