From 62f18bdc2c0e3badc5da5bd36aae9dd89633c125 Mon Sep 17 00:00:00 2001 From: Steve Myers Date: Sat, 3 Jul 2021 10:16:02 -0700 Subject: [PATCH] Reorganized code into wallet mod/package --- .../org/bitcoindevkit/bdk/ResultBase.kt | 38 -------------- .../bitcoindevkit/bdk/{ => types}/Result.kt | 6 ++- .../bdk/{ => types}/StringResult.kt | 3 +- .../bdk/{ => types}/VoidResult.kt | 3 +- .../bdk/{ => wallet}/BlockchainConfig.kt | 2 +- .../bdk/{ => wallet}/DatabaseConfig.kt | 4 +- .../bdk/{ => wallet}/VecLocalUtxoResult.kt | 6 ++- .../bitcoindevkit/bdk/{ => wallet}/Wallet.kt | 8 ++- .../bdk/{ => wallet}/WalletResult.kt | 4 +- .../kotlin/org/bitcoindevkit/bdk/LibTest.kt | 1 + cc/bdk_ffi.h | 52 +++++++++---------- src/lib.rs | 2 - src/types.rs | 2 +- src/{ => wallet}/blockchain.rs | 0 src/{ => wallet}/database.rs | 0 src/{wallet.rs => wallet/mod.rs} | 52 +++++++++++-------- 16 files changed, 85 insertions(+), 98 deletions(-) delete mode 100644 bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/ResultBase.kt rename bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/{ => types}/Result.kt (83%) rename bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/{ => types}/StringResult.kt (85%) rename bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/{ => types}/VoidResult.kt (83%) rename bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/{ => wallet}/BlockchainConfig.kt (93%) rename bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/{ => wallet}/DatabaseConfig.kt (89%) rename bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/{ => wallet}/VecLocalUtxoResult.kt (82%) rename bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/{ => wallet}/Wallet.kt (77%) rename bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/{ => wallet}/WalletResult.kt (80%) rename src/{ => wallet}/blockchain.rs (100%) rename src/{ => wallet}/database.rs (100%) rename src/{wallet.rs => wallet/mod.rs} (96%) diff --git a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/ResultBase.kt b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/ResultBase.kt deleted file mode 100644 index 5fcf168..0000000 --- a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/ResultBase.kt +++ /dev/null @@ -1,38 +0,0 @@ -package org.bitcoindevkit.bdk - -import com.sun.jna.Pointer -import com.sun.jna.PointerType -import org.slf4j.Logger -import org.slf4j.LoggerFactory - -abstract class ResultBase internal constructor(private val pointerT: PT) : - LibBase() { - - protected open val log: Logger = LoggerFactory.getLogger(ResultBase::class.java) - - protected abstract fun err(pointerT: PT): Pointer? - - protected abstract fun ok(pointerT: PT): RT - - protected abstract fun free(pointerT: PT) - - private fun checkErr(pointerT: PT) { - val errPointer = err(pointerT) - val err = errPointer?.getString(0) - libJna.free_string(errPointer) - if (err != null) { - log.error("JnaError: $err") - throw JnaException(JnaError.valueOf(err)) - } - } - - fun value(): RT { - checkErr(pointerT) - return ok(pointerT) - } - - protected fun finalize() { - free(pointerT) - log.debug("$pointerT freed") - } -} \ No newline at end of file diff --git a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/Result.kt b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/types/Result.kt similarity index 83% rename from bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/Result.kt rename to bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/types/Result.kt index 6ceef7f..1208930 100644 --- a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/Result.kt +++ b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/types/Result.kt @@ -1,6 +1,10 @@ -package org.bitcoindevkit.bdk +package org.bitcoindevkit.bdk.types import com.sun.jna.Pointer +import org.bitcoindevkit.bdk.FfiResult +import org.bitcoindevkit.bdk.JnaError +import org.bitcoindevkit.bdk.JnaException +import org.bitcoindevkit.bdk.LibBase import org.slf4j.Logger import org.slf4j.LoggerFactory diff --git a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/StringResult.kt b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/types/StringResult.kt similarity index 85% rename from bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/StringResult.kt rename to bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/types/StringResult.kt index 29da3eb..5489fcf 100644 --- a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/StringResult.kt +++ b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/types/StringResult.kt @@ -1,6 +1,7 @@ -package org.bitcoindevkit.bdk +package org.bitcoindevkit.bdk.types import com.sun.jna.Pointer +import org.bitcoindevkit.bdk.LibJna class StringResult constructor(stringResultPtr: LibJna.FfiResult_char_ptr_t.ByValue) : Result(stringResultPtr) { diff --git a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/VoidResult.kt b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/types/VoidResult.kt similarity index 83% rename from bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/VoidResult.kt rename to bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/types/VoidResult.kt index 03b46be..36eb799 100644 --- a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/VoidResult.kt +++ b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/types/VoidResult.kt @@ -1,6 +1,7 @@ -package org.bitcoindevkit.bdk +package org.bitcoindevkit.bdk.types import com.sun.jna.Pointer +import org.bitcoindevkit.bdk.LibJna class VoidResult constructor(voidResultPtr: LibJna.FfiResult_void_t.ByValue) : Result(voidResultPtr) { diff --git a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/BlockchainConfig.kt b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/BlockchainConfig.kt similarity index 93% rename from bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/BlockchainConfig.kt rename to bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/BlockchainConfig.kt index e604975..592f299 100644 --- a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/BlockchainConfig.kt +++ b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/BlockchainConfig.kt @@ -3,7 +3,7 @@ package org.bitcoindevkit.bdk import org.slf4j.Logger import org.slf4j.LoggerFactory -abstract class BlockchainConfig() : LibBase() { +abstract class BlockchainConfig : LibBase() { private val log: Logger = LoggerFactory.getLogger(BlockchainConfig::class.java) abstract val blockchainConfigT: LibJna.BlockchainConfig_t diff --git a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/DatabaseConfig.kt b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/DatabaseConfig.kt similarity index 89% rename from bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/DatabaseConfig.kt rename to bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/DatabaseConfig.kt index 2f29fcd..f163ff0 100644 --- a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/DatabaseConfig.kt +++ b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/DatabaseConfig.kt @@ -3,7 +3,7 @@ package org.bitcoindevkit.bdk import org.slf4j.Logger import org.slf4j.LoggerFactory -abstract class DatabaseConfig() : LibBase() { +abstract class DatabaseConfig : LibBase() { private val log: Logger = LoggerFactory.getLogger(DatabaseConfig::class.java) abstract val databaseConfigT: LibJna.DatabaseConfig_t @@ -13,7 +13,7 @@ abstract class DatabaseConfig() : LibBase() { } } -class MemoryConfig() : DatabaseConfig() { +class MemoryConfig : DatabaseConfig() { private val log: Logger = LoggerFactory.getLogger(MemoryConfig::class.java) override val databaseConfigT = libJna.new_memory_config() diff --git a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/VecLocalUtxoResult.kt b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/VecLocalUtxoResult.kt similarity index 82% rename from bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/VecLocalUtxoResult.kt rename to bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/VecLocalUtxoResult.kt index da69a1b..ec52e8e 100644 --- a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/VecLocalUtxoResult.kt +++ b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/VecLocalUtxoResult.kt @@ -1,5 +1,9 @@ -package org.bitcoindevkit.bdk +package org.bitcoindevkit.bdk.wallet +import org.bitcoindevkit.bdk.JnaError +import org.bitcoindevkit.bdk.JnaException +import org.bitcoindevkit.bdk.LibBase +import org.bitcoindevkit.bdk.LibJna import org.slf4j.Logger import org.slf4j.LoggerFactory diff --git a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/Wallet.kt b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/Wallet.kt similarity index 77% rename from bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/Wallet.kt rename to bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/Wallet.kt index 7abea00..c8d9e4d 100644 --- a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/Wallet.kt +++ b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/Wallet.kt @@ -1,5 +1,11 @@ -package org.bitcoindevkit.bdk +package org.bitcoindevkit.bdk.wallet +import org.bitcoindevkit.bdk.BlockchainConfig +import org.bitcoindevkit.bdk.DatabaseConfig +import org.bitcoindevkit.bdk.LibBase +import org.bitcoindevkit.bdk.LibJna +import org.bitcoindevkit.bdk.types.StringResult +import org.bitcoindevkit.bdk.types.VoidResult import org.slf4j.Logger import org.slf4j.LoggerFactory diff --git a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/WalletResult.kt b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/WalletResult.kt similarity index 80% rename from bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/WalletResult.kt rename to bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/WalletResult.kt index ba8f979..5082df9 100644 --- a/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/WalletResult.kt +++ b/bdk-kotlin/jvm/src/main/kotlin/org/bitcoindevkit/bdk/wallet/WalletResult.kt @@ -1,6 +1,8 @@ -package org.bitcoindevkit.bdk +package org.bitcoindevkit.bdk.wallet import com.sun.jna.Pointer +import org.bitcoindevkit.bdk.LibJna +import org.bitcoindevkit.bdk.types.Result class WalletResult constructor(walletResultPtr: LibJna.FfiResult_OpaqueWallet_t.ByValue) : Result(walletResultPtr) { diff --git a/bdk-kotlin/test-fixtures/src/main/kotlin/org/bitcoindevkit/bdk/LibTest.kt b/bdk-kotlin/test-fixtures/src/main/kotlin/org/bitcoindevkit/bdk/LibTest.kt index 5c84338..cf943b9 100644 --- a/bdk-kotlin/test-fixtures/src/main/kotlin/org/bitcoindevkit/bdk/LibTest.kt +++ b/bdk-kotlin/test-fixtures/src/main/kotlin/org/bitcoindevkit/bdk/LibTest.kt @@ -1,5 +1,6 @@ package org.bitcoindevkit.bdk +import org.bitcoindevkit.bdk.wallet.Wallet import org.junit.Assert.* import org.junit.Test import org.slf4j.Logger diff --git a/cc/bdk_ffi.h b/cc/bdk_ffi.h index eba536a..b3c3dad 100644 --- a/cc/bdk_ffi.h +++ b/cc/bdk_ffi.h @@ -50,6 +50,28 @@ FfiResult_OpaqueWallet_t new_wallet_result ( void free_wallet_result ( FfiResult_OpaqueWallet_t wallet_result); +typedef struct { + + void * ok; + + char * * err; + +} FfiResult_void_t; + +FfiResult_void_t sync_wallet ( + OpaqueWallet_t const * opaque_wallet); + +typedef struct { + + char * * ok; + + char * * err; + +} FfiResult_char_ptr_t; + +FfiResult_char_ptr_t new_address ( + OpaqueWallet_t const * opaque_wallet); + typedef struct { char * txid; @@ -97,34 +119,12 @@ typedef struct { } FfiResultVec_LocalUtxo_t; -void free_unspent_result ( - FfiResultVec_LocalUtxo_t unspent_result); - -typedef struct { - - void * ok; - - char * * err; - -} FfiResult_void_t; - -FfiResult_void_t sync_wallet ( - OpaqueWallet_t const * opaque_wallet); - -typedef struct { - - char * * ok; - - char * * err; - -} FfiResult_char_ptr_t; - -FfiResult_char_ptr_t new_address ( - OpaqueWallet_t const * opaque_wallet); - FfiResultVec_LocalUtxo_t list_unspent ( OpaqueWallet_t const * opaque_wallet); +void free_unspent_result ( + FfiResultVec_LocalUtxo_t unspent_result); + DatabaseConfig_t * new_memory_config (void); DatabaseConfig_t * new_sled_config ( @@ -141,7 +141,7 @@ void free_void_result ( FfiResult_void_t void_result); /** \brief - * Frees a Rust-allocated string + * Free a Rust-allocated string */ void free_string ( char * string); diff --git a/src/lib.rs b/src/lib.rs index e1a9c00..21b8266 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,5 @@ #![deny(unsafe_code)] /* No `unsafe` needed! */ -mod blockchain; -mod database; mod error; mod types; mod wallet; diff --git a/src/types.rs b/src/types.rs index 25a1f2a..079e9cd 100644 --- a/src/types.rs +++ b/src/types.rs @@ -27,7 +27,7 @@ fn free_void_result(void_result: FfiResult<()>) { } // TODO do we need this? remove? -/// Frees a Rust-allocated string +/// Free a Rust-allocated string #[ffi_export] fn free_string(string: Option) { drop(string) diff --git a/src/blockchain.rs b/src/wallet/blockchain.rs similarity index 100% rename from src/blockchain.rs rename to src/wallet/blockchain.rs diff --git a/src/database.rs b/src/wallet/database.rs similarity index 100% rename from src/database.rs rename to src/wallet/database.rs diff --git a/src/wallet.rs b/src/wallet/mod.rs similarity index 96% rename from src/wallet.rs rename to src/wallet/mod.rs index b7996dc..300d4c0 100644 --- a/src/wallet.rs +++ b/src/wallet/mod.rs @@ -9,11 +9,17 @@ use bdk::{Error, Wallet}; use safer_ffi::boxed::Box; use safer_ffi::char_p::{char_p_boxed, char_p_ref}; -use crate::blockchain::BlockchainConfig; -use crate::database::DatabaseConfig; +use blockchain::BlockchainConfig; +use database::DatabaseConfig; + use crate::error::get_name; use crate::types::{FfiResult, FfiResultVec}; +mod blockchain; +mod database; + +// create a new wallet + #[derive_ReprC] #[ReprC::opaque] pub struct OpaqueWallet { @@ -45,15 +51,29 @@ fn new_wallet_result( } } +fn new_wallet( + descriptor: String, + change_descriptor: Option, + blockchain_config: &AnyBlockchainConfig, + database_config: &AnyDatabaseConfig, +) -> Result, Error> { + let network = Testnet; + + let client = AnyBlockchain::from_config(blockchain_config)?; + let database = AnyDatabase::from_config(database_config)?; + + let descriptor: &str = descriptor.as_str(); + let change_descriptor: Option<&str> = change_descriptor.as_deref(); + + Wallet::new(descriptor, change_descriptor, network, database, client) +} + #[ffi_export] fn free_wallet_result(wallet_result: FfiResult) { drop(wallet_result); } -#[ffi_export] -fn free_unspent_result(unspent_result: FfiResultVec) { - drop(unspent_result) -} +// wallet operations #[ffi_export] fn sync_wallet(opaque_wallet: &OpaqueWallet) -> FfiResult<()> { @@ -105,24 +125,12 @@ fn list_unspent(opaque_wallet: &OpaqueWallet) -> FfiResultVec { } } -fn new_wallet( - descriptor: String, - change_descriptor: Option, - blockchain_config: &AnyBlockchainConfig, - database_config: &AnyDatabaseConfig, -) -> Result, Error> { - let network = Testnet; - - let client = AnyBlockchain::from_config(blockchain_config)?; - let database = AnyDatabase::from_config(database_config)?; - - let descriptor: &str = descriptor.as_str(); - let change_descriptor: Option<&str> = change_descriptor.as_deref(); - - Wallet::new(descriptor, change_descriptor, network, database, client) +#[ffi_export] +fn free_unspent_result(unspent_result: FfiResultVec) { + drop(unspent_result) } -// Non-opaque returned structs +// Non-opaque returned values #[derive_ReprC] #[repr(C)]