Reorganized code into wallet mod/package
This commit is contained in:
parent
f8365cc939
commit
62f18bdc2c
@ -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")
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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) {
|
@ -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) {
|
@ -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
|
||||
|
@ -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()
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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) {
|
@ -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
|
||||
|
52
cc/bdk_ffi.h
52
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);
|
||||
|
@ -1,7 +1,5 @@
|
||||
#![deny(unsafe_code)] /* No `unsafe` needed! */
|
||||
|
||||
mod blockchain;
|
||||
mod database;
|
||||
mod error;
|
||||
mod types;
|
||||
mod wallet;
|
||||
|
@ -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)
|
||||
|
@ -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)]
|
Loading…
x
Reference in New Issue
Block a user