Skip to content

Commit 204c16b

Browse files
committed
feat: add BIP39 mnemonic utility functions
- Adds BIP39 utilities for mnemonic validation, word suggestions, entropy conversion, and seed generation - Bumps bitcoin-address-generator version to 0.2.0 - Bumps version to 0.1.16
1 parent 59ad2da commit 204c16b

File tree

25 files changed

+911
-19
lines changed

25 files changed

+911
-19
lines changed

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "bitkitcore"
3-
version = "0.1.15"
3+
version = "0.1.16"
44
edition = "2021"
55

66
[lib]
@@ -30,7 +30,7 @@ rust-blocktank-client = { version = "0.0.16", features = ["rustls-tls"] }
3030
reqwest = { version = "0.12.12", features = ["json", "rustls-tls", "rustls-tls-native-roots"], default-features = false }
3131
r2d2 = "0.8.10"
3232
r2d2_sqlite = "0.25.0"
33-
bitcoin-address-generator = "0.1.1"
33+
bitcoin-address-generator = "0.2.0"
3434
uuid = { version = "1.16.0", features = ["v4"] }
3535
hex = "0.4.3"
3636
bip39 = "2.0"

Package.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
import PackageDescription
55

6-
let tag = "v0.1.15"
7-
let checksum = "49914370d4d8dc016104e3da72acd4f16535eaec3d3c68083238e238660a71ef"
6+
let tag = "v0.1.16"
7+
let checksum = "9b9e09eb0dcc570313a26b0a32518deaf561a46d58389cf211eadc0859d8c4eb"
88
let url = "https://github.com/synonymdev/bitkit-core/releases/download/\(tag)/BitkitCore.xcframework.zip"
99

1010
let package = Package(

bindings/android/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ android.useAndroidX=true
33
android.enableJetifier=true
44
kotlin.code.style=official
55
group=com.synonym
6-
version=0.1.15
6+
version=0.1.16
Binary file not shown.
Binary file not shown.
213 KB
Binary file not shown.
249 KB
Binary file not shown.

bindings/android/lib/src/main/kotlin/com/synonym/bitkitcore/bitkitcore.kt

Lines changed: 146 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,20 @@ internal interface UniffiForeignFutureCompleteVoid : com.sun.jna.Callback {
788788

789789

790790

791+
792+
793+
794+
795+
796+
797+
798+
799+
800+
801+
802+
803+
804+
791805

792806

793807

@@ -838,6 +852,8 @@ internal interface UniffiLib : Library {
838852
): RustBuffer.ByValue
839853
fun uniffi_bitkitcore_fn_func_derive_private_key(`mnemonicPhrase`: RustBuffer.ByValue,`derivationPathStr`: RustBuffer.ByValue,`network`: RustBuffer.ByValue,`bip39Passphrase`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus,
840854
): RustBuffer.ByValue
855+
fun uniffi_bitkitcore_fn_func_entropy_to_mnemonic(`entropy`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus,
856+
): RustBuffer.ByValue
841857
fun uniffi_bitkitcore_fn_func_estimate_order_fee(`lspBalanceSat`: Long,`channelExpiryWeeks`: Int,`options`: RustBuffer.ByValue,
842858
): Long
843859
fun uniffi_bitkitcore_fn_func_estimate_order_fee_full(`lspBalanceSat`: Long,`channelExpiryWeeks`: Int,`options`: RustBuffer.ByValue,
@@ -852,6 +868,10 @@ internal interface UniffiLib : Library {
852868
): RustBuffer.ByValue
853869
fun uniffi_bitkitcore_fn_func_get_all_unique_tags(uniffi_out_err: UniffiRustCallStatus,
854870
): RustBuffer.ByValue
871+
fun uniffi_bitkitcore_fn_func_get_bip39_suggestions(`partialWord`: RustBuffer.ByValue,`limit`: Int,uniffi_out_err: UniffiRustCallStatus,
872+
): RustBuffer.ByValue
873+
fun uniffi_bitkitcore_fn_func_get_bip39_wordlist(uniffi_out_err: UniffiRustCallStatus,
874+
): RustBuffer.ByValue
855875
fun uniffi_bitkitcore_fn_func_get_cjit_entries(`entryIds`: RustBuffer.ByValue,`filter`: RustBuffer.ByValue,`refresh`: Byte,
856876
): Long
857877
fun uniffi_bitkitcore_fn_func_get_gift(`giftId`: RustBuffer.ByValue,
@@ -876,8 +896,14 @@ internal interface UniffiLib : Library {
876896
): RustBuffer.ByValue
877897
fun uniffi_bitkitcore_fn_func_insert_activity(`activity`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus,
878898
): Unit
899+
fun uniffi_bitkitcore_fn_func_is_valid_bip39_word(`word`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus,
900+
): Byte
879901
fun uniffi_bitkitcore_fn_func_lnurl_auth(`domain`: RustBuffer.ByValue,`k1`: RustBuffer.ByValue,`callback`: RustBuffer.ByValue,`bip32Mnemonic`: RustBuffer.ByValue,`network`: RustBuffer.ByValue,`bip39Passphrase`: RustBuffer.ByValue,
880902
): Long
903+
fun uniffi_bitkitcore_fn_func_mnemonic_to_entropy(`mnemonicPhrase`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus,
904+
): RustBuffer.ByValue
905+
fun uniffi_bitkitcore_fn_func_mnemonic_to_seed(`mnemonicPhrase`: RustBuffer.ByValue,`passphrase`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus,
906+
): RustBuffer.ByValue
881907
fun uniffi_bitkitcore_fn_func_open_channel(`orderId`: RustBuffer.ByValue,`connectionString`: RustBuffer.ByValue,
882908
): Long
883909
fun uniffi_bitkitcore_fn_func_refresh_active_cjit_entries(
@@ -924,6 +950,8 @@ internal interface UniffiLib : Library {
924950
): Unit
925951
fun uniffi_bitkitcore_fn_func_validate_bitcoin_address(`address`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus,
926952
): RustBuffer.ByValue
953+
fun uniffi_bitkitcore_fn_func_validate_mnemonic(`mnemonicPhrase`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus,
954+
): Unit
927955
fun ffi_bitkitcore_rustbuffer_alloc(`size`: Long,uniffi_out_err: UniffiRustCallStatus,
928956
): RustBuffer.ByValue
929957
fun ffi_bitkitcore_rustbuffer_from_bytes(`bytes`: ForeignBytes.ByValue,uniffi_out_err: UniffiRustCallStatus,
@@ -1056,6 +1084,8 @@ internal interface UniffiLib : Library {
10561084
): Short
10571085
fun uniffi_bitkitcore_checksum_func_derive_private_key(
10581086
): Short
1087+
fun uniffi_bitkitcore_checksum_func_entropy_to_mnemonic(
1088+
): Short
10591089
fun uniffi_bitkitcore_checksum_func_estimate_order_fee(
10601090
): Short
10611091
fun uniffi_bitkitcore_checksum_func_estimate_order_fee_full(
@@ -1070,6 +1100,10 @@ internal interface UniffiLib : Library {
10701100
): Short
10711101
fun uniffi_bitkitcore_checksum_func_get_all_unique_tags(
10721102
): Short
1103+
fun uniffi_bitkitcore_checksum_func_get_bip39_suggestions(
1104+
): Short
1105+
fun uniffi_bitkitcore_checksum_func_get_bip39_wordlist(
1106+
): Short
10731107
fun uniffi_bitkitcore_checksum_func_get_cjit_entries(
10741108
): Short
10751109
fun uniffi_bitkitcore_checksum_func_get_gift(
@@ -1094,8 +1128,14 @@ internal interface UniffiLib : Library {
10941128
): Short
10951129
fun uniffi_bitkitcore_checksum_func_insert_activity(
10961130
): Short
1131+
fun uniffi_bitkitcore_checksum_func_is_valid_bip39_word(
1132+
): Short
10971133
fun uniffi_bitkitcore_checksum_func_lnurl_auth(
10981134
): Short
1135+
fun uniffi_bitkitcore_checksum_func_mnemonic_to_entropy(
1136+
): Short
1137+
fun uniffi_bitkitcore_checksum_func_mnemonic_to_seed(
1138+
): Short
10991139
fun uniffi_bitkitcore_checksum_func_open_channel(
11001140
): Short
11011141
fun uniffi_bitkitcore_checksum_func_refresh_active_cjit_entries(
@@ -1142,6 +1182,8 @@ internal interface UniffiLib : Library {
11421182
): Short
11431183
fun uniffi_bitkitcore_checksum_func_validate_bitcoin_address(
11441184
): Short
1185+
fun uniffi_bitkitcore_checksum_func_validate_mnemonic(
1186+
): Short
11451187
fun ffi_bitkitcore_uniffi_contract_version(
11461188
): Int
11471189

@@ -1189,6 +1231,9 @@ private fun uniffiCheckApiChecksums(lib: UniffiLib) {
11891231
if (lib.uniffi_bitkitcore_checksum_func_derive_private_key() != 25155.toShort()) {
11901232
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
11911233
}
1234+
if (lib.uniffi_bitkitcore_checksum_func_entropy_to_mnemonic() != 26123.toShort()) {
1235+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
1236+
}
11921237
if (lib.uniffi_bitkitcore_checksum_func_estimate_order_fee() != 9548.toShort()) {
11931238
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
11941239
}
@@ -1210,6 +1255,12 @@ private fun uniffiCheckApiChecksums(lib: UniffiLib) {
12101255
if (lib.uniffi_bitkitcore_checksum_func_get_all_unique_tags() != 25431.toShort()) {
12111256
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
12121257
}
1258+
if (lib.uniffi_bitkitcore_checksum_func_get_bip39_suggestions() != 20658.toShort()) {
1259+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
1260+
}
1261+
if (lib.uniffi_bitkitcore_checksum_func_get_bip39_wordlist() != 30814.toShort()) {
1262+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
1263+
}
12131264
if (lib.uniffi_bitkitcore_checksum_func_get_cjit_entries() != 29342.toShort()) {
12141265
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
12151266
}
@@ -1246,9 +1297,18 @@ private fun uniffiCheckApiChecksums(lib: UniffiLib) {
12461297
if (lib.uniffi_bitkitcore_checksum_func_insert_activity() != 1510.toShort()) {
12471298
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
12481299
}
1300+
if (lib.uniffi_bitkitcore_checksum_func_is_valid_bip39_word() != 31846.toShort()) {
1301+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
1302+
}
12491303
if (lib.uniffi_bitkitcore_checksum_func_lnurl_auth() != 58593.toShort()) {
12501304
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
12511305
}
1306+
if (lib.uniffi_bitkitcore_checksum_func_mnemonic_to_entropy() != 36669.toShort()) {
1307+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
1308+
}
1309+
if (lib.uniffi_bitkitcore_checksum_func_mnemonic_to_seed() != 40039.toShort()) {
1310+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
1311+
}
12521312
if (lib.uniffi_bitkitcore_checksum_func_open_channel() != 21402.toShort()) {
12531313
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
12541314
}
@@ -1318,6 +1378,9 @@ private fun uniffiCheckApiChecksums(lib: UniffiLib) {
13181378
if (lib.uniffi_bitkitcore_checksum_func_validate_bitcoin_address() != 56003.toShort()) {
13191379
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
13201380
}
1381+
if (lib.uniffi_bitkitcore_checksum_func_validate_mnemonic() != 31005.toShort()) {
1382+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
1383+
}
13211384
}
13221385

13231386
// Async support
@@ -5809,6 +5872,12 @@ sealed class AddressException: Exception() {
58095872
get() = ""
58105873
}
58115874

5875+
class InvalidEntropy(
5876+
) : AddressException() {
5877+
override val message
5878+
get() = ""
5879+
}
5880+
58125881
class AddressDerivationFailed(
58135882
) : AddressException() {
58145883
override val message
@@ -5832,7 +5901,8 @@ public object FfiConverterTypeAddressError : FfiConverterRustBuffer<AddressExcep
58325901
2 -> AddressException.InvalidNetwork()
58335902
3 -> AddressException.MnemonicGenerationFailed()
58345903
4 -> AddressException.InvalidMnemonic()
5835-
5 -> AddressException.AddressDerivationFailed()
5904+
5 -> AddressException.InvalidEntropy()
5905+
6 -> AddressException.AddressDerivationFailed()
58365906
else -> throw RuntimeException("invalid error enum value, something is very wrong!!")
58375907
}
58385908
}
@@ -5855,6 +5925,10 @@ public object FfiConverterTypeAddressError : FfiConverterRustBuffer<AddressExcep
58555925
// Add the size for the Int that specifies the variant plus the size needed for all fields
58565926
4UL
58575927
)
5928+
is AddressException.InvalidEntropy -> (
5929+
// Add the size for the Int that specifies the variant plus the size needed for all fields
5930+
4UL
5931+
)
58585932
is AddressException.AddressDerivationFailed -> (
58595933
// Add the size for the Int that specifies the variant plus the size needed for all fields
58605934
4UL
@@ -5880,10 +5954,14 @@ public object FfiConverterTypeAddressError : FfiConverterRustBuffer<AddressExcep
58805954
buf.putInt(4)
58815955
Unit
58825956
}
5883-
is AddressException.AddressDerivationFailed -> {
5957+
is AddressException.InvalidEntropy -> {
58845958
buf.putInt(5)
58855959
Unit
58865960
}
5961+
is AddressException.AddressDerivationFailed -> {
5962+
buf.putInt(6)
5963+
Unit
5964+
}
58875965
}.let { /* this makes the `when` an expression, which ensures it is exhaustive */ }
58885966
}
58895967

@@ -10764,6 +10842,16 @@ public object FfiConverterMapStringString: FfiConverterRustBuffer<Map<kotlin.Str
1076410842
}
1076510843

1076610844

10845+
@Throws(AddressException::class) fun `entropyToMnemonic`(`entropy`: kotlin.ByteArray): kotlin.String {
10846+
return FfiConverterString.lift(
10847+
uniffiRustCallWithError(AddressException) { _status ->
10848+
UniffiLib.INSTANCE.uniffi_bitkitcore_fn_func_entropy_to_mnemonic(
10849+
FfiConverterByteArray.lower(`entropy`),_status)
10850+
}
10851+
)
10852+
}
10853+
10854+
1076710855
@Throws(BlocktankException::class)
1076810856
@Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE")
1076910857
suspend fun `estimateOrderFee`(`lspBalanceSat`: kotlin.ULong, `channelExpiryWeeks`: kotlin.UInt, `options`: CreateOrderOptions?) : IBtEstimateFeeResponse {
@@ -10843,6 +10931,24 @@ public object FfiConverterMapStringString: FfiConverterRustBuffer<Map<kotlin.Str
1084310931
)
1084410932
}
1084510933

10934+
fun `getBip39Suggestions`(`partialWord`: kotlin.String, `limit`: kotlin.UInt): List<kotlin.String> {
10935+
return FfiConverterSequenceString.lift(
10936+
uniffiRustCall() { _status ->
10937+
UniffiLib.INSTANCE.uniffi_bitkitcore_fn_func_get_bip39_suggestions(
10938+
FfiConverterString.lower(`partialWord`),FfiConverterUInt.lower(`limit`),_status)
10939+
}
10940+
)
10941+
}
10942+
10943+
fun `getBip39Wordlist`(): List<kotlin.String> {
10944+
return FfiConverterSequenceString.lift(
10945+
uniffiRustCall() { _status ->
10946+
UniffiLib.INSTANCE.uniffi_bitkitcore_fn_func_get_bip39_wordlist(
10947+
_status)
10948+
}
10949+
)
10950+
}
10951+
1084610952

1084710953
@Throws(BlocktankException::class)
1084810954
@Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE")
@@ -11007,6 +11113,15 @@ public object FfiConverterMapStringString: FfiConverterRustBuffer<Map<kotlin.Str
1100711113
}
1100811114

1100911115

11116+
fun `isValidBip39Word`(`word`: kotlin.String): kotlin.Boolean {
11117+
return FfiConverterBoolean.lift(
11118+
uniffiRustCall() { _status ->
11119+
UniffiLib.INSTANCE.uniffi_bitkitcore_fn_func_is_valid_bip39_word(
11120+
FfiConverterString.lower(`word`),_status)
11121+
}
11122+
)
11123+
}
11124+
1101011125

1101111126
@Throws(LnurlException::class)
1101211127
@Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE")
@@ -11023,6 +11138,26 @@ public object FfiConverterMapStringString: FfiConverterRustBuffer<Map<kotlin.Str
1102311138
)
1102411139
}
1102511140

11141+
@Throws(AddressException::class) fun `mnemonicToEntropy`(`mnemonicPhrase`: kotlin.String): kotlin.ByteArray {
11142+
return FfiConverterByteArray.lift(
11143+
uniffiRustCallWithError(AddressException) { _status ->
11144+
UniffiLib.INSTANCE.uniffi_bitkitcore_fn_func_mnemonic_to_entropy(
11145+
FfiConverterString.lower(`mnemonicPhrase`),_status)
11146+
}
11147+
)
11148+
}
11149+
11150+
11151+
@Throws(AddressException::class) fun `mnemonicToSeed`(`mnemonicPhrase`: kotlin.String, `passphrase`: kotlin.String?): kotlin.ByteArray {
11152+
return FfiConverterByteArray.lift(
11153+
uniffiRustCallWithError(AddressException) { _status ->
11154+
UniffiLib.INSTANCE.uniffi_bitkitcore_fn_func_mnemonic_to_seed(
11155+
FfiConverterString.lower(`mnemonicPhrase`),FfiConverterOptionalString.lower(`passphrase`),_status)
11156+
}
11157+
)
11158+
}
11159+
11160+
1102611161
@Throws(BlocktankException::class)
1102711162
@Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE")
1102811163
suspend fun `openChannel`(`orderId`: kotlin.String, `connectionString`: kotlin.String) : IBtOrder {
@@ -11313,4 +11448,13 @@ public object FfiConverterMapStringString: FfiConverterRustBuffer<Map<kotlin.Str
1131311448
}
1131411449

1131511450

11451+
@Throws(AddressException::class) fun `validateMnemonic`(`mnemonicPhrase`: kotlin.String)
11452+
=
11453+
uniffiRustCallWithError(AddressException) { _status ->
11454+
UniffiLib.INSTANCE.uniffi_bitkitcore_fn_func_validate_mnemonic(
11455+
FfiConverterString.lower(`mnemonicPhrase`),_status)
11456+
}
11457+
11458+
11459+
1131611460

138 KB
Binary file not shown.

0 commit comments

Comments
 (0)