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 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.Logger
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
|
|
@ -1,6 +1,7 @@
|
|||||||
package org.bitcoindevkit.bdk
|
package org.bitcoindevkit.bdk.types
|
||||||
|
|
||||||
import com.sun.jna.Pointer
|
import com.sun.jna.Pointer
|
||||||
|
import org.bitcoindevkit.bdk.LibJna
|
||||||
|
|
||||||
class StringResult constructor(stringResultPtr: LibJna.FfiResult_char_ptr_t.ByValue) :
|
class StringResult constructor(stringResultPtr: LibJna.FfiResult_char_ptr_t.ByValue) :
|
||||||
Result<LibJna.FfiResult_char_ptr_t.ByValue, String>(stringResultPtr) {
|
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 com.sun.jna.Pointer
|
||||||
|
import org.bitcoindevkit.bdk.LibJna
|
||||||
|
|
||||||
class VoidResult constructor(voidResultPtr: LibJna.FfiResult_void_t.ByValue) :
|
class VoidResult constructor(voidResultPtr: LibJna.FfiResult_void_t.ByValue) :
|
||||||
Result<LibJna.FfiResult_void_t.ByValue, Unit>(voidResultPtr) {
|
Result<LibJna.FfiResult_void_t.ByValue, Unit>(voidResultPtr) {
|
@ -3,7 +3,7 @@ package org.bitcoindevkit.bdk
|
|||||||
import org.slf4j.Logger
|
import org.slf4j.Logger
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
|
|
||||||
abstract class BlockchainConfig() : LibBase() {
|
abstract class BlockchainConfig : LibBase() {
|
||||||
private val log: Logger = LoggerFactory.getLogger(BlockchainConfig::class.java)
|
private val log: Logger = LoggerFactory.getLogger(BlockchainConfig::class.java)
|
||||||
abstract val blockchainConfigT: LibJna.BlockchainConfig_t
|
abstract val blockchainConfigT: LibJna.BlockchainConfig_t
|
||||||
|
|
@ -3,7 +3,7 @@ package org.bitcoindevkit.bdk
|
|||||||
import org.slf4j.Logger
|
import org.slf4j.Logger
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
|
|
||||||
abstract class DatabaseConfig() : LibBase() {
|
abstract class DatabaseConfig : LibBase() {
|
||||||
private val log: Logger = LoggerFactory.getLogger(DatabaseConfig::class.java)
|
private val log: Logger = LoggerFactory.getLogger(DatabaseConfig::class.java)
|
||||||
abstract val databaseConfigT: LibJna.DatabaseConfig_t
|
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)
|
private val log: Logger = LoggerFactory.getLogger(MemoryConfig::class.java)
|
||||||
override val databaseConfigT = libJna.new_memory_config()
|
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.Logger
|
||||||
import org.slf4j.LoggerFactory
|
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.Logger
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
|
|
@ -1,6 +1,8 @@
|
|||||||
package org.bitcoindevkit.bdk
|
package org.bitcoindevkit.bdk.wallet
|
||||||
|
|
||||||
import com.sun.jna.Pointer
|
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) :
|
class WalletResult constructor(walletResultPtr: LibJna.FfiResult_OpaqueWallet_t.ByValue) :
|
||||||
Result<LibJna.FfiResult_OpaqueWallet_t.ByValue, LibJna.OpaqueWallet_t>(walletResultPtr) {
|
Result<LibJna.FfiResult_OpaqueWallet_t.ByValue, LibJna.OpaqueWallet_t>(walletResultPtr) {
|
@ -1,5 +1,6 @@
|
|||||||
package org.bitcoindevkit.bdk
|
package org.bitcoindevkit.bdk
|
||||||
|
|
||||||
|
import org.bitcoindevkit.bdk.wallet.Wallet
|
||||||
import org.junit.Assert.*
|
import org.junit.Assert.*
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.slf4j.Logger
|
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 (
|
void free_wallet_result (
|
||||||
FfiResult_OpaqueWallet_t 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 {
|
typedef struct {
|
||||||
|
|
||||||
char * txid;
|
char * txid;
|
||||||
@ -97,34 +119,12 @@ typedef struct {
|
|||||||
|
|
||||||
} FfiResultVec_LocalUtxo_t;
|
} 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 (
|
FfiResultVec_LocalUtxo_t list_unspent (
|
||||||
OpaqueWallet_t const * opaque_wallet);
|
OpaqueWallet_t const * opaque_wallet);
|
||||||
|
|
||||||
|
void free_unspent_result (
|
||||||
|
FfiResultVec_LocalUtxo_t unspent_result);
|
||||||
|
|
||||||
DatabaseConfig_t * new_memory_config (void);
|
DatabaseConfig_t * new_memory_config (void);
|
||||||
|
|
||||||
DatabaseConfig_t * new_sled_config (
|
DatabaseConfig_t * new_sled_config (
|
||||||
@ -141,7 +141,7 @@ void free_void_result (
|
|||||||
FfiResult_void_t void_result);
|
FfiResult_void_t void_result);
|
||||||
|
|
||||||
/** \brief
|
/** \brief
|
||||||
* Frees a Rust-allocated string
|
* Free a Rust-allocated string
|
||||||
*/
|
*/
|
||||||
void free_string (
|
void free_string (
|
||||||
char * string);
|
char * string);
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
#![deny(unsafe_code)] /* No `unsafe` needed! */
|
#![deny(unsafe_code)] /* No `unsafe` needed! */
|
||||||
|
|
||||||
mod blockchain;
|
|
||||||
mod database;
|
|
||||||
mod error;
|
mod error;
|
||||||
mod types;
|
mod types;
|
||||||
mod wallet;
|
mod wallet;
|
||||||
|
@ -27,7 +27,7 @@ fn free_void_result(void_result: FfiResult<()>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO do we need this? remove?
|
// TODO do we need this? remove?
|
||||||
/// Frees a Rust-allocated string
|
/// Free a Rust-allocated string
|
||||||
#[ffi_export]
|
#[ffi_export]
|
||||||
fn free_string(string: Option<char_p_boxed>) {
|
fn free_string(string: Option<char_p_boxed>) {
|
||||||
drop(string)
|
drop(string)
|
||||||
|
@ -9,11 +9,17 @@ use bdk::{Error, Wallet};
|
|||||||
use safer_ffi::boxed::Box;
|
use safer_ffi::boxed::Box;
|
||||||
use safer_ffi::char_p::{char_p_boxed, char_p_ref};
|
use safer_ffi::char_p::{char_p_boxed, char_p_ref};
|
||||||
|
|
||||||
use crate::blockchain::BlockchainConfig;
|
use blockchain::BlockchainConfig;
|
||||||
use crate::database::DatabaseConfig;
|
use database::DatabaseConfig;
|
||||||
|
|
||||||
use crate::error::get_name;
|
use crate::error::get_name;
|
||||||
use crate::types::{FfiResult, FfiResultVec};
|
use crate::types::{FfiResult, FfiResultVec};
|
||||||
|
|
||||||
|
mod blockchain;
|
||||||
|
mod database;
|
||||||
|
|
||||||
|
// create a new wallet
|
||||||
|
|
||||||
#[derive_ReprC]
|
#[derive_ReprC]
|
||||||
#[ReprC::opaque]
|
#[ReprC::opaque]
|
||||||
pub struct OpaqueWallet {
|
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]
|
#[ffi_export]
|
||||||
fn free_wallet_result(wallet_result: FfiResult<OpaqueWallet>) {
|
fn free_wallet_result(wallet_result: FfiResult<OpaqueWallet>) {
|
||||||
drop(wallet_result);
|
drop(wallet_result);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[ffi_export]
|
// wallet operations
|
||||||
fn free_unspent_result(unspent_result: FfiResultVec<LocalUtxo>) {
|
|
||||||
drop(unspent_result)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[ffi_export]
|
#[ffi_export]
|
||||||
fn sync_wallet(opaque_wallet: &OpaqueWallet) -> FfiResult<()> {
|
fn sync_wallet(opaque_wallet: &OpaqueWallet) -> FfiResult<()> {
|
||||||
@ -105,24 +125,12 @@ fn list_unspent(opaque_wallet: &OpaqueWallet) -> FfiResultVec<LocalUtxo> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_wallet(
|
#[ffi_export]
|
||||||
descriptor: String,
|
fn free_unspent_result(unspent_result: FfiResultVec<LocalUtxo>) {
|
||||||
change_descriptor: Option<String>,
|
drop(unspent_result)
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Non-opaque returned structs
|
// Non-opaque returned values
|
||||||
|
|
||||||
#[derive_ReprC]
|
#[derive_ReprC]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
Loading…
x
Reference in New Issue
Block a user