Reorganized code into wallet mod/package

This commit is contained in:
Steve Myers 2021-07-03 10:16:02 -07:00
parent f8365cc939
commit 62f18bdc2c
16 changed files with 85 additions and 98 deletions

View File

@ -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<PT : PointerType, RT : Any> 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")
}
}

View File

@ -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

View File

@ -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<LibJna.FfiResult_char_ptr_t.ByValue, String>(stringResultPtr) {

View File

@ -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<LibJna.FfiResult_void_t.ByValue, Unit>(voidResultPtr) {

View File

@ -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

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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<LibJna.FfiResult_OpaqueWallet_t.ByValue, LibJna.OpaqueWallet_t>(walletResultPtr) {

View File

@ -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

View File

@ -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);

View File

@ -1,7 +1,5 @@
#![deny(unsafe_code)] /* No `unsafe` needed! */
mod blockchain;
mod database;
mod error;
mod types;
mod wallet;

View File

@ -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<char_p_boxed>) {
drop(string)

View File

@ -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<String>,
blockchain_config: &AnyBlockchainConfig,
database_config: &AnyDatabaseConfig,
) -> Result<Wallet<AnyBlockchain, AnyDatabase>, 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<OpaqueWallet>) {
drop(wallet_result);
}
#[ffi_export]
fn free_unspent_result(unspent_result: FfiResultVec<LocalUtxo>) {
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<LocalUtxo> {
}
}
fn new_wallet(
descriptor: String,
change_descriptor: Option<String>,
blockchain_config: &AnyBlockchainConfig,
database_config: &AnyDatabaseConfig,
) -> Result<Wallet<AnyBlockchain, AnyDatabase>, 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<LocalUtxo>) {
drop(unspent_result)
}
// Non-opaque returned structs
// Non-opaque returned values
#[derive_ReprC]
#[repr(C)]