From fffb2e2cbcd15a906256875e49e37e2141ecf132 Mon Sep 17 00:00:00 2001 From: Steve Myers Date: Thu, 14 Oct 2021 10:58:16 -0700 Subject: [PATCH] Add Network enum as wallet constructor param --- README.md | 2 +- .../src/main/kotlin/uniffi/bdk/bdk.kt | 63 ++++++++++++++----- .../src/test/kotlin/uniffi/bdk/LibTest.kt | 6 +- src/bdk.udl | 9 ++- src/lib.rs | 17 +++-- 5 files changed, 69 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 95133d9..4ace128 100644 --- a/README.md +++ b/README.md @@ -41,4 +41,4 @@ See the [UniFFI User Guide](https://mozilla.github.io/uniffi-rs/) 1. Use `build.sh` script (TODO do it all in build.rs instead) 2. Create tests in `bindings/bdk-kotlin` and/or `bindings/bdk-swift` - 3. Use `test.sh` to run all bindings tests \ No newline at end of file + 3. Use `test.sh` to run all bindings tests diff --git a/bindings/bdk-kotlin/src/main/kotlin/uniffi/bdk/bdk.kt b/bindings/bdk-kotlin/src/main/kotlin/uniffi/bdk/bdk.kt index 1398b9e..14333b7 100644 --- a/bindings/bdk-kotlin/src/main/kotlin/uniffi/bdk/bdk.kt +++ b/bindings/bdk-kotlin/src/main/kotlin/uniffi/bdk/bdk.kt @@ -44,15 +44,15 @@ open class RustBuffer : Structure() { companion object { internal fun alloc(size: Int = 0) = rustCall() { status -> - _UniFFILib.INSTANCE.ffi_bdk_f91_rustbuffer_alloc(size, status) + _UniFFILib.INSTANCE.ffi_bdk_f470_rustbuffer_alloc(size, status) } internal fun free(buf: RustBuffer.ByValue) = rustCall() { status -> - _UniFFILib.INSTANCE.ffi_bdk_f91_rustbuffer_free(buf, status) + _UniFFILib.INSTANCE.ffi_bdk_f470_rustbuffer_free(buf, status) } internal fun reserve(buf: RustBuffer.ByValue, additional: Int) = rustCall() { status -> - _UniFFILib.INSTANCE.ffi_bdk_f91_rustbuffer_reserve(buf, additional, status) + _UniFFILib.INSTANCE.ffi_bdk_f470_rustbuffer_reserve(buf, additional, status) } } @@ -261,6 +261,12 @@ internal fun String.write(buf: RustBufferBuilder) { + + + + + + @@ -295,31 +301,31 @@ internal interface _UniFFILib : Library { } } - fun ffi_bdk_f91_OfflineWallet_object_free(ptr: Pointer, + fun ffi_bdk_f470_OfflineWallet_object_free(ptr: Pointer, uniffi_out_err: RustCallStatus ): Unit - fun bdk_f91_OfflineWallet_new(descriptor: RustBuffer.ByValue,database_config: RustBuffer.ByValue, + fun bdk_f470_OfflineWallet_new(network: RustBuffer.ByValue,descriptor: RustBuffer.ByValue,database_config: RustBuffer.ByValue, uniffi_out_err: RustCallStatus ): Pointer - fun bdk_f91_OfflineWallet_get_new_address(ptr: Pointer, + fun bdk_f470_OfflineWallet_get_new_address(ptr: Pointer, uniffi_out_err: RustCallStatus ): RustBuffer.ByValue - fun ffi_bdk_f91_rustbuffer_alloc(size: Int, + fun ffi_bdk_f470_rustbuffer_alloc(size: Int, uniffi_out_err: RustCallStatus ): RustBuffer.ByValue - fun ffi_bdk_f91_rustbuffer_from_bytes(bytes: ForeignBytes.ByValue, + fun ffi_bdk_f470_rustbuffer_from_bytes(bytes: ForeignBytes.ByValue, uniffi_out_err: RustCallStatus ): RustBuffer.ByValue - fun ffi_bdk_f91_rustbuffer_free(buf: RustBuffer.ByValue, + fun ffi_bdk_f470_rustbuffer_free(buf: RustBuffer.ByValue, uniffi_out_err: RustCallStatus ): Unit - fun ffi_bdk_f91_rustbuffer_reserve(buf: RustBuffer.ByValue,additional: Int, + fun ffi_bdk_f470_rustbuffer_reserve(buf: RustBuffer.ByValue,additional: Int, uniffi_out_err: RustCallStatus ): RustBuffer.ByValue @@ -498,6 +504,35 @@ abstract class FFIObject( +enum class Network { + BITCOIN,TESTNET,SIGNET,REGTEST; + + companion object { + internal fun lift(rbuf: RustBuffer.ByValue): Network { + return liftFromRustBuffer(rbuf) { buf -> Network.read(buf) } + } + + internal fun read(buf: ByteBuffer) = + try { values()[buf.getInt() - 1] } + catch (e: IndexOutOfBoundsException) { + throw RuntimeException("invalid enum value, something is very wrong!!", e) + } + } + + internal fun lower(): RustBuffer.ByValue { + return lowerIntoRustBuffer(this, {v, buf -> v.write(buf)}) + } + + internal fun write(buf: RustBufferBuilder) { + buf.putInt(this.ordinal + 1) + } +} + + + + + + @@ -769,10 +804,10 @@ public interface OfflineWalletInterface { class OfflineWallet( pointer: Pointer ) : FFIObject(pointer), OfflineWalletInterface { - constructor(descriptor: String, databaseConfig: DatabaseConfig ) : + constructor(network: Network, descriptor: String, databaseConfig: DatabaseConfig ) : this( rustCallWithError(BdkException) { status -> - _UniFFILib.INSTANCE.bdk_f91_OfflineWallet_new(descriptor.lower(), databaseConfig.lower() ,status) + _UniFFILib.INSTANCE.bdk_f470_OfflineWallet_new(network.lower(), descriptor.lower(), databaseConfig.lower() ,status) }) /** @@ -785,7 +820,7 @@ class OfflineWallet( */ override protected fun freeRustArcPtr() { rustCall() { status -> - _UniFFILib.INSTANCE.ffi_bdk_f91_OfflineWallet_object_free(this.pointer, status) + _UniFFILib.INSTANCE.ffi_bdk_f470_OfflineWallet_object_free(this.pointer, status) } } @@ -800,7 +835,7 @@ class OfflineWallet( override fun getNewAddress(): String = callWithPointer { rustCall() { status -> - _UniFFILib.INSTANCE.bdk_f91_OfflineWallet_get_new_address(it, status) + _UniFFILib.INSTANCE.bdk_f470_OfflineWallet_get_new_address(it, status) } }.let { String.lift(it) diff --git a/bindings/bdk-kotlin/src/test/kotlin/uniffi/bdk/LibTest.kt b/bindings/bdk-kotlin/src/test/kotlin/uniffi/bdk/LibTest.kt index b64dc79..20f9b36 100644 --- a/bindings/bdk-kotlin/src/test/kotlin/uniffi/bdk/LibTest.kt +++ b/bindings/bdk-kotlin/src/test/kotlin/uniffi/bdk/LibTest.kt @@ -15,7 +15,7 @@ class LibTest { @Test fun memoryWalletNewAddress() { val config = DatabaseConfig.Memory("") - val wallet = OfflineWallet(desc, config) + val wallet = OfflineWallet(Network.REGTEST, desc, config) val address = wallet.getNewAddress() assertNotNull(address) assertEquals(address, "bcrt1qzg4mckdh50nwdm9hkzq06528rsu73hjxytqkxs") @@ -24,13 +24,13 @@ class LibTest { @Test(expected=BdkException.Descriptor::class) fun invalidDescriptorExceptionIsThrown() { val config = DatabaseConfig.Memory("") - OfflineWallet("invalid-descriptor", config) + OfflineWallet(Network.REGTEST, "invalid-descriptor", config) } @Test fun sledWalletNewAddress() { val config = DatabaseConfig.Sled(SledDbConfiguration("/tmp/testdb", "testdb")) - val wallet = OfflineWallet(desc, config) + val wallet = OfflineWallet(Network.REGTEST, desc, config) val address = wallet.getNewAddress() assertNotNull(address) assertEquals(address, "bcrt1qzg4mckdh50nwdm9hkzq06528rsu73hjxytqkxs") diff --git a/src/bdk.udl b/src/bdk.udl index e79ddcc..f87a7fe 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -44,6 +44,13 @@ enum BdkError { "Sled", }; +enum Network { + "Bitcoin", + "Testnet", + "Signet", + "Regtest", +}; + dictionary SledDbConfiguration { string path; string tree_name; @@ -57,6 +64,6 @@ interface DatabaseConfig { interface OfflineWallet { [Throws=BdkError] - constructor(string descriptor, DatabaseConfig database_config); + constructor(Network network, string descriptor, DatabaseConfig database_config); string get_new_address(); }; diff --git a/src/lib.rs b/src/lib.rs index db824ca..3d8b8b3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,6 +7,8 @@ use bdk::Wallet; use std::sync::Mutex; +uniffi_macros::include_scaffolding!("bdk"); + type BdkError = Error; pub enum DatabaseConfig { @@ -14,25 +16,22 @@ pub enum DatabaseConfig { Sled { configuration: SledDbConfiguration }, } -uniffi_macros::include_scaffolding!("bdk"); - struct OfflineWallet { wallet: Mutex>, } impl OfflineWallet { - fn new(descriptor: String, database_config: DatabaseConfig) -> Result { + fn new( + network: Network, + descriptor: String, + database_config: DatabaseConfig, + ) -> Result { let any_database_config = match database_config { DatabaseConfig::Memory { .. } => AnyDatabaseConfig::Memory(()), DatabaseConfig::Sled { configuration } => AnyDatabaseConfig::Sled(configuration), }; let database = AnyDatabase::from_config(&any_database_config)?; - let wallet = Mutex::new(Wallet::new_offline( - &descriptor, - None, - Network::Regtest, - database, - )?); + let wallet = Mutex::new(Wallet::new_offline(&descriptor, None, network, database)?); Ok(OfflineWallet { wallet }) }