Refactor to return results by value, add wallet list_unspent and related types
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
package org.bitcoindevkit.bdk
|
||||
|
||||
import com.sun.jna.Pointer
|
||||
import com.sun.jna.Structure
|
||||
|
||||
abstract class FfiResult : Structure {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
|
||||
@JvmField
|
||||
var ok: Pointer? = null
|
||||
|
||||
@JvmField
|
||||
var err: Pointer? = null
|
||||
}
|
||||
@@ -1,52 +1,48 @@
|
||||
package org.bitcoindevkit.bdk
|
||||
|
||||
import com.sun.jna.Library
|
||||
import com.sun.jna.Pointer
|
||||
import com.sun.jna.PointerType
|
||||
import com.sun.jna.*
|
||||
|
||||
interface LibJna : Library {
|
||||
|
||||
// typedef struct VoidResult VoidResult_t;
|
||||
class VoidResult_t : PointerType {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
// typedef struct {
|
||||
//
|
||||
// char * * ok;
|
||||
//
|
||||
// char * * err;
|
||||
//
|
||||
// } FfiResult_char_ptr_t;
|
||||
open class FfiResult_char_ptr_t : FfiResult() {
|
||||
class ByValue : FfiResult_char_ptr_t(), Structure.ByValue
|
||||
class ByReference : FfiResult_char_ptr_t(), Structure.ByReference
|
||||
|
||||
override fun getFieldOrder() = listOf("ok", "err")
|
||||
}
|
||||
|
||||
// char * get_void_err (
|
||||
// VoidResult_t const * void_result);
|
||||
fun get_void_err(void_result: VoidResult_t): Pointer?
|
||||
|
||||
// void free_void_result (
|
||||
// VoidResult_t * void_result);
|
||||
fun free_void_result(void_result: VoidResult_t)
|
||||
|
||||
// typedef struct StringResult StringResult_t;
|
||||
class StringResult_t : PointerType {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
}
|
||||
|
||||
// char * get_string_ok (
|
||||
// StringResult_t const * string_result);
|
||||
fun get_string_ok(string_result: StringResult_t): Pointer?
|
||||
|
||||
// char * get_string_err (
|
||||
// StringResult_t const * string_result);
|
||||
fun get_string_err(string_result: StringResult_t): Pointer?
|
||||
|
||||
// void free_string_result (
|
||||
// StringResult_t * string_result);
|
||||
fun free_string_result(string_result: StringResult_t)
|
||||
// FfiResult_char_ptr_t string_result);
|
||||
fun free_string_result(string_result: FfiResult_char_ptr_t.ByValue)
|
||||
|
||||
// typedef struct WalletRef WalletRef_t;
|
||||
class WalletRef_t : PointerType {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
// typedef struct {
|
||||
//
|
||||
// void * ok;
|
||||
//
|
||||
// char * * err;
|
||||
//
|
||||
// } FfiResult_void_t;
|
||||
open class FfiResult_void_t : FfiResult() {
|
||||
class ByValue : FfiResult_void_t(), Structure.ByValue
|
||||
class ByReference : FfiResult_void_t(), Structure.ByReference
|
||||
|
||||
override fun getFieldOrder() = listOf("ok", "err")
|
||||
}
|
||||
|
||||
// void free_wallet_ref (
|
||||
// WalletRef_t * wallet_ref);
|
||||
fun free_wallet_ref(wallet_ref: WalletRef_t)
|
||||
// void free_void_result (
|
||||
// FfiResult_void_t void_result);
|
||||
fun free_void_result(void_result: FfiResult_void_t.ByValue)
|
||||
|
||||
// void free_string (
|
||||
// char * string);
|
||||
fun free_string(string: Pointer?)
|
||||
|
||||
// typedef struct BlockchainConfig BlockchainConfig_t;
|
||||
class BlockchainConfig_t : PointerType {
|
||||
@@ -54,54 +50,6 @@ interface LibJna : Library {
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
}
|
||||
|
||||
// typedef struct DatabaseConfig DatabaseConfig_t;
|
||||
class DatabaseConfig_t : PointerType {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
}
|
||||
|
||||
// typedef struct WalletResult WalletResult_t;
|
||||
class WalletResult_t : PointerType {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
}
|
||||
|
||||
// WalletResult_t * new_wallet_result (
|
||||
// char const * descriptor,
|
||||
// char const * change_descriptor,
|
||||
// BlockchainConfig_t const * blockchain_config,
|
||||
// DatabaseConfig_t const * database_config);
|
||||
fun new_wallet_result(
|
||||
descriptor: String,
|
||||
changeDescriptor: String?,
|
||||
blockchainConfig: BlockchainConfig_t,
|
||||
databaseConfig: DatabaseConfig_t,
|
||||
): WalletResult_t
|
||||
|
||||
// char * get_wallet_err (
|
||||
// WalletResult_t const * wallet_result);
|
||||
fun get_wallet_err(wallet_result: WalletResult_t): Pointer?
|
||||
|
||||
// WalletRef_t * get_wallet_ok (
|
||||
// WalletResult_t const * wallet_result);
|
||||
fun get_wallet_ok(wallet_result: WalletResult_t): WalletRef_t?
|
||||
|
||||
// VoidResult_t * sync_wallet (
|
||||
// WalletRef_t const * wallet_ref);
|
||||
fun sync_wallet(wallet_ref: Pointer): VoidResult_t
|
||||
|
||||
// StringResult_t * new_address (
|
||||
// WalletRef_t const * wallet_ref);
|
||||
fun new_address(wallet_ref: Pointer): StringResult_t
|
||||
|
||||
// void free_wallet_result (
|
||||
// WalletResult_t * wallet_result);
|
||||
fun free_wallet_result(wallet_result: WalletResult_t)
|
||||
|
||||
// void free_string (
|
||||
// char * string);
|
||||
fun free_string(string: Pointer?)
|
||||
|
||||
// BlockchainConfig_t * new_electrum_config (
|
||||
// char const * url,
|
||||
// char const * socks5,
|
||||
@@ -118,6 +66,193 @@ interface LibJna : Library {
|
||||
// BlockchainConfig_t * blockchain_config);
|
||||
fun free_blockchain_config(blockchain_config: BlockchainConfig_t)
|
||||
|
||||
// typedef struct DatabaseConfig DatabaseConfig_t;
|
||||
class DatabaseConfig_t : PointerType {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
}
|
||||
|
||||
// typedef struct OpaqueWallet OpaqueWallet_t;
|
||||
class OpaqueWallet_t : PointerType {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
}
|
||||
|
||||
// typedef struct {
|
||||
//
|
||||
// OpaqueWallet_t * ok;
|
||||
//
|
||||
// char * * err;
|
||||
//
|
||||
// } FfiResult_OpaqueWallet_t;
|
||||
open class FfiResult_OpaqueWallet_t : FfiResult() {
|
||||
class ByValue : FfiResult_OpaqueWallet_t(), Structure.ByValue
|
||||
class ByReference : FfiResult_OpaqueWallet_t(), Structure.ByReference
|
||||
|
||||
override fun getFieldOrder() = listOf("ok", "err")
|
||||
}
|
||||
|
||||
// FfiResult_OpaqueWallet_t new_wallet_result (
|
||||
// char const * descriptor,
|
||||
// char const * change_descriptor,
|
||||
// BlockchainConfig_t const * blockchain_config,
|
||||
// DatabaseConfig_t const * database_config);
|
||||
fun new_wallet_result(
|
||||
descriptor: String,
|
||||
changeDescriptor: String?,
|
||||
blockchainConfig: BlockchainConfig_t,
|
||||
databaseConfig: DatabaseConfig_t,
|
||||
): FfiResult_OpaqueWallet_t.ByValue
|
||||
|
||||
// void free_wallet_result (
|
||||
// FfiResult_OpaqueWallet_t wallet_result);
|
||||
fun free_wallet_result(wallet_result: FfiResult_OpaqueWallet_t.ByValue)
|
||||
|
||||
// typedef struct {
|
||||
//
|
||||
// char * txid;
|
||||
//
|
||||
// uint32_t vout;
|
||||
//
|
||||
// } OutPoint_t;
|
||||
open class OutPoint_t : Structure() {
|
||||
class ByValue : OutPoint_t(), Structure.ByValue
|
||||
|
||||
@JvmField
|
||||
var txid: String? = null
|
||||
|
||||
@JvmField
|
||||
var vout: Int? = null
|
||||
|
||||
override fun getFieldOrder() = listOf("txid", "vout")
|
||||
}
|
||||
|
||||
// typedef struct {
|
||||
//
|
||||
// uint64_t value;
|
||||
//
|
||||
// char * script_pubkey;
|
||||
//
|
||||
// } TxOut_t;
|
||||
open class TxOut_t : Structure() {
|
||||
class ByValue : TxOut_t(), Structure.ByValue
|
||||
|
||||
@JvmField
|
||||
var value: Long? = null
|
||||
|
||||
@JvmField
|
||||
var script_pubkey: String? = null
|
||||
|
||||
override fun getFieldOrder() = listOf("value", "script_pubkey")
|
||||
}
|
||||
|
||||
// typedef struct {
|
||||
//
|
||||
// OutPoint_t outpoint;
|
||||
//
|
||||
// TxOut_t txout;
|
||||
//
|
||||
// uint16_t keychain;
|
||||
//
|
||||
// } LocalUtxo_t;
|
||||
open class LocalUtxo_t : Structure {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
|
||||
class ByValue : LocalUtxo_t, Structure.ByValue {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
}
|
||||
|
||||
class ByReference : LocalUtxo_t, Structure.ByReference {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
}
|
||||
|
||||
@JvmField
|
||||
var outpoint: OutPoint_t? = null
|
||||
|
||||
@JvmField
|
||||
var txout: TxOut_t? = null
|
||||
|
||||
@JvmField
|
||||
var keychain: Short? = null
|
||||
|
||||
override fun getFieldOrder() = listOf("outpoint", "txout", "keychain")
|
||||
}
|
||||
|
||||
// typedef struct {
|
||||
//
|
||||
// LocalUtxo_t * ptr;
|
||||
//
|
||||
// size_t len;
|
||||
//
|
||||
// size_t cap;
|
||||
//
|
||||
// } Vec_LocalUtxo_t;
|
||||
open class Vec_LocalUtxo_t : Structure {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
|
||||
class ByReference : Vec_LocalUtxo_t, Structure.ByReference {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
}
|
||||
|
||||
class ByValue : Vec_LocalUtxo_t, Structure.ByValue {
|
||||
constructor() : super()
|
||||
constructor(pointer: Pointer) : super(pointer)
|
||||
}
|
||||
|
||||
@JvmField
|
||||
var ptr: LocalUtxo_t.ByReference? = null
|
||||
|
||||
@JvmField
|
||||
var len: NativeLong? = null
|
||||
|
||||
@JvmField
|
||||
var cap: NativeLong? = null
|
||||
|
||||
override fun getFieldOrder() = listOf("ptr", "len", "cap")
|
||||
}
|
||||
|
||||
// typedef struct {
|
||||
//
|
||||
// Vec_LocalUtxo_t ok;
|
||||
//
|
||||
// char * * err;
|
||||
//
|
||||
// } FfiResultVec_LocalUtxo_t;
|
||||
open class FfiResultVec_LocalUtxo_t : Structure() {
|
||||
|
||||
class ByValue : FfiResultVec_LocalUtxo_t(), Structure.ByValue
|
||||
class ByReference : FfiResultVec_LocalUtxo_t(), Structure.ByReference
|
||||
|
||||
@JvmField
|
||||
var ok: Vec_LocalUtxo_t = Vec_LocalUtxo_t()
|
||||
|
||||
@JvmField
|
||||
var err: Pointer? = null
|
||||
|
||||
override fun getFieldOrder() = listOf("ok", "err")
|
||||
}
|
||||
|
||||
// void free_unspent_result (
|
||||
// FfiResultVec_LocalUtxo_t unspent_result);
|
||||
fun free_unspent_result(unspent_result: FfiResultVec_LocalUtxo_t.ByValue)
|
||||
|
||||
// FfiResult_void_t sync_wallet (
|
||||
// OpaqueWallet_t const * opaque_wallet);
|
||||
fun sync_wallet(opaque_wallet: OpaqueWallet_t): FfiResult_void_t.ByValue
|
||||
|
||||
// FfiResult_char_ptr_t new_address (
|
||||
// OpaqueWallet_t const * opaque_wallet);
|
||||
fun new_address(opaque_wallet: OpaqueWallet_t): FfiResult_char_ptr_t.ByValue
|
||||
|
||||
// FfiResult_Vec_LocalUtxo_t list_unspent (
|
||||
// OpaqueWallet_t const * opaque_wallet);
|
||||
fun list_unspent(opaque_wallet: OpaqueWallet_t): FfiResultVec_LocalUtxo_t.ByValue
|
||||
|
||||
// DatabaseConfig_t * new_memory_config (void);
|
||||
fun new_memory_config(): DatabaseConfig_t
|
||||
|
||||
|
||||
37
bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/Result.kt
Normal file
37
bdk-kotlin/jvm/src/main/java/org/bitcoindevkit/bdk/Result.kt
Normal file
@@ -0,0 +1,37 @@
|
||||
package org.bitcoindevkit.bdk
|
||||
|
||||
import com.sun.jna.Pointer
|
||||
import org.slf4j.Logger
|
||||
import org.slf4j.LoggerFactory
|
||||
|
||||
abstract class Result<T : FfiResult, RT : Any>(private val ffiResult: T): LibBase() {
|
||||
|
||||
protected open val log: Logger = LoggerFactory.getLogger(Result::class.java)
|
||||
|
||||
protected abstract fun getOkValue(pointer: Pointer): RT
|
||||
|
||||
protected abstract fun freeResult(ffiResult: T)
|
||||
|
||||
fun value(): RT {
|
||||
val err = ffiResult.err
|
||||
val ok = ffiResult.ok
|
||||
when {
|
||||
err != null -> {
|
||||
val errString = err.getPointer(0).getString(0)
|
||||
log.error("JnaError: $errString")
|
||||
throw JnaException(JnaError.valueOf(errString))
|
||||
}
|
||||
ok != null -> {
|
||||
return getOkValue(ok)
|
||||
}
|
||||
else -> {
|
||||
throw JnaException(JnaError.Generic)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected fun finalize() {
|
||||
freeResult(ffiResult)
|
||||
log.debug("$ffiResult freed")
|
||||
}
|
||||
}
|
||||
@@ -1,26 +1,15 @@
|
||||
package org.bitcoindevkit.bdk
|
||||
|
||||
import com.sun.jna.Pointer
|
||||
import org.slf4j.Logger
|
||||
import org.slf4j.LoggerFactory
|
||||
|
||||
class StringResult internal constructor(stringResultT: LibJna.StringResult_t) :
|
||||
ResultBase<LibJna.StringResult_t, String>(stringResultT) {
|
||||
class StringResult constructor(stringResultPtr: LibJna.FfiResult_char_ptr_t.ByValue) :
|
||||
Result<LibJna.FfiResult_char_ptr_t.ByValue, String>(stringResultPtr) {
|
||||
|
||||
override val log: Logger = LoggerFactory.getLogger(StringResult::class.java)
|
||||
|
||||
override fun err(pointerT: LibJna.StringResult_t): Pointer? {
|
||||
return libJna.get_string_err(pointerT)
|
||||
override fun getOkValue(pointer: Pointer): String {
|
||||
return pointer.getPointer(0).getString(0)
|
||||
}
|
||||
|
||||
override fun ok(pointerT: LibJna.StringResult_t): String {
|
||||
val okPointer = libJna.get_string_ok(pointerT)
|
||||
val ok = okPointer!!.getString(0)
|
||||
libJna.free_string(okPointer)
|
||||
return ok
|
||||
}
|
||||
|
||||
override fun free(pointerT: LibJna.StringResult_t) {
|
||||
libJna.free_string_result(pointerT)
|
||||
override fun freeResult(ffiResult: LibJna.FfiResult_char_ptr_t.ByValue) {
|
||||
libJna.free_string_result(ffiResult)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package org.bitcoindevkit.bdk
|
||||
|
||||
import org.slf4j.Logger
|
||||
import org.slf4j.LoggerFactory
|
||||
|
||||
class VecLocalUtxoResult(private val ffiResult: LibJna.FfiResultVec_LocalUtxo_t.ByValue) :
|
||||
LibBase() {
|
||||
|
||||
protected open val log: Logger = LoggerFactory.getLogger(VecLocalUtxoResult::class.java)
|
||||
|
||||
fun value(): Array<LibJna.LocalUtxo_t.ByReference> {
|
||||
val err = ffiResult.err
|
||||
val ok = ffiResult.ok
|
||||
when {
|
||||
err != null -> {
|
||||
val errString = err.getPointer(0).getString(0)
|
||||
log.error("JnaError: $errString")
|
||||
throw JnaException(JnaError.valueOf(errString))
|
||||
}
|
||||
else -> {
|
||||
val first = ok.ptr!!
|
||||
return first.toArray(ok.len!!.toInt()) as Array<LibJna.LocalUtxo_t.ByReference>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected fun finalize() {
|
||||
libJna.free_unspent_result(ffiResult)
|
||||
log.debug("$ffiResult freed")
|
||||
}
|
||||
}
|
||||
@@ -1,23 +1,15 @@
|
||||
package org.bitcoindevkit.bdk
|
||||
|
||||
import com.sun.jna.Pointer
|
||||
import org.slf4j.Logger
|
||||
import org.slf4j.LoggerFactory
|
||||
|
||||
class VoidResult internal constructor(voidResultT: LibJna.VoidResult_t) :
|
||||
ResultBase<LibJna.VoidResult_t, Unit>(voidResultT) {
|
||||
class VoidResult constructor(voidResultPtr: LibJna.FfiResult_void_t.ByValue) :
|
||||
Result<LibJna.FfiResult_void_t.ByValue, Unit>(voidResultPtr) {
|
||||
|
||||
override val log: Logger = LoggerFactory.getLogger(VoidResult::class.java)
|
||||
|
||||
override fun err(pointerT: LibJna.VoidResult_t): Pointer? {
|
||||
return libJna.get_void_err(pointerT)
|
||||
override fun getOkValue(pointer: Pointer) {
|
||||
// No value
|
||||
}
|
||||
|
||||
override fun ok(pointerT: LibJna.VoidResult_t) {
|
||||
// Void
|
||||
}
|
||||
|
||||
override fun free(pointerT: LibJna.VoidResult_t) {
|
||||
libJna.free_void_result(pointerT)
|
||||
override fun freeResult(ffiResult: LibJna.FfiResult_void_t.ByValue) {
|
||||
libJna.free_void_result(ffiResult)
|
||||
}
|
||||
}
|
||||
@@ -12,29 +12,28 @@ class Wallet constructor(
|
||||
|
||||
val log: Logger = LoggerFactory.getLogger(Wallet::class.java)
|
||||
|
||||
private val walletResult =
|
||||
WalletResult(
|
||||
libJna.new_wallet_result(
|
||||
descriptor,
|
||||
changeDescriptor,
|
||||
blockchainConfig.blockchainConfigT,
|
||||
databaseConfig.databaseConfigT
|
||||
)
|
||||
private val walletResult = WalletResult(
|
||||
libJna.new_wallet_result(
|
||||
descriptor,
|
||||
changeDescriptor,
|
||||
blockchainConfig.blockchainConfigT,
|
||||
databaseConfig.databaseConfigT
|
||||
)
|
||||
private val walletRefT = walletResult.value()
|
||||
)
|
||||
private val wallet = walletResult.value()
|
||||
|
||||
fun sync() {
|
||||
val voidResult = VoidResult(libJna.sync_wallet(walletRefT.pointer))
|
||||
val voidResult = VoidResult(libJna.sync_wallet(wallet))
|
||||
return voidResult.value()
|
||||
}
|
||||
|
||||
fun getAddress(): String {
|
||||
val stringResult = StringResult(libJna.new_address(walletRefT.pointer))
|
||||
val stringResult = StringResult(libJna.new_address(wallet))
|
||||
return stringResult.value()
|
||||
}
|
||||
|
||||
protected fun finalize(walletRefT: LibJna.WalletRef_t) {
|
||||
libJna.free_wallet_ref(walletRefT)
|
||||
log.debug("$walletRefT freed")
|
||||
|
||||
fun listUnspent(): Array<LibJna.LocalUtxo_t.ByReference> {
|
||||
val vecLocalUtxoResult = VecLocalUtxoResult(libJna.list_unspent(wallet))
|
||||
return vecLocalUtxoResult.value()
|
||||
}
|
||||
}
|
||||
@@ -1,23 +1,15 @@
|
||||
package org.bitcoindevkit.bdk
|
||||
|
||||
import com.sun.jna.Pointer
|
||||
import org.slf4j.Logger
|
||||
import org.slf4j.LoggerFactory
|
||||
|
||||
class WalletResult internal constructor(walletResultT: LibJna.WalletResult_t) :
|
||||
ResultBase<LibJna.WalletResult_t, LibJna.WalletRef_t>(walletResultT) {
|
||||
class WalletResult constructor(walletResultPtr: LibJna.FfiResult_OpaqueWallet_t.ByValue) :
|
||||
Result<LibJna.FfiResult_OpaqueWallet_t.ByValue, LibJna.OpaqueWallet_t>(walletResultPtr) {
|
||||
|
||||
override val log: Logger = LoggerFactory.getLogger(WalletResult::class.java)
|
||||
|
||||
override fun err(pointerT: LibJna.WalletResult_t): Pointer? {
|
||||
return libJna.get_wallet_err(pointerT)
|
||||
override fun getOkValue(pointer: Pointer): LibJna.OpaqueWallet_t {
|
||||
return LibJna.OpaqueWallet_t(pointer)
|
||||
}
|
||||
|
||||
override fun ok(pointerT: LibJna.WalletResult_t): LibJna.WalletRef_t {
|
||||
return libJna.get_wallet_ok(pointerT)!!
|
||||
}
|
||||
|
||||
override fun free(pointerT: LibJna.WalletResult_t) {
|
||||
libJna.free_wallet_result(pointerT)
|
||||
override fun freeResult(ffiResult: LibJna.FfiResult_OpaqueWallet_t.ByValue) {
|
||||
libJna.free_wallet_result(ffiResult)
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,9 @@ abstract class LibTest : LibBase() {
|
||||
val change =
|
||||
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/1/*)"
|
||||
|
||||
val blockchainConfig = ElectrumConfig("ssl://electrum.blockstream.info:60002", null, 5, 30)
|
||||
val databaseConfig = MemoryConfig()
|
||||
|
||||
abstract fun getTestDataDir(): String
|
||||
|
||||
fun cleanupTestDataDir() {
|
||||
@@ -27,48 +30,69 @@ abstract class LibTest : LibBase() {
|
||||
|
||||
@Test
|
||||
fun walletResultError() {
|
||||
val blockchainConfig = ElectrumConfig("ssl://electrum.blockstream.info:60002", null, 5, 30)
|
||||
val databaseConfig = MemoryConfig()
|
||||
val jnaException = assertThrows(JnaException::class.java) {
|
||||
Wallet("bad", "bad", blockchainConfig, databaseConfig)
|
||||
}
|
||||
assertEquals(jnaException.err, JnaError.Descriptor)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun walletResultFinalize() {
|
||||
val blockchainConfig = ElectrumConfig("ssl://electrum.blockstream.info:60002", null, 5, 30)
|
||||
val databaseConfig = MemoryConfig()
|
||||
val names = listOf("one", "two", "three")
|
||||
names.map {
|
||||
val wallet = Wallet(desc, change, blockchainConfig, databaseConfig)
|
||||
assertNotNull(wallet)
|
||||
}
|
||||
System.gc()
|
||||
// The only way to verify wallets freed is by checking the log
|
||||
}
|
||||
// @Test
|
||||
// fun walletResultFinalize() {
|
||||
// run {
|
||||
// val desc =
|
||||
// "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)"
|
||||
// val change =
|
||||
// "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/1/*)"
|
||||
//
|
||||
// val blockchainConfig = ElectrumConfig("ssl://electrum.blockstream.info:60002", null, 5, 30)
|
||||
// val databaseConfig = MemoryConfig()
|
||||
// val wallet = Wallet(desc, change, blockchainConfig, databaseConfig)
|
||||
// wallet.sync()
|
||||
// assertNotNull(wallet.getAddress())
|
||||
// }
|
||||
// System.gc()
|
||||
// Thread.sleep(2000)
|
||||
// // The only way to verify wallets freed is by checking the log
|
||||
// }
|
||||
|
||||
@Test
|
||||
fun walletSync() {
|
||||
val blockchainConfig = ElectrumConfig("ssl://electrum.blockstream.info:60002", null, 5, 30)
|
||||
val testDataDir = getTestDataDir()
|
||||
log.debug("testDataDir = $testDataDir")
|
||||
// log.debug("testDataDir = $testDataDir")
|
||||
val databaseConfig = SledConfig(testDataDir, "steve-test")
|
||||
val wallet = Wallet(desc, change, blockchainConfig, databaseConfig)
|
||||
assertNotNull(wallet)
|
||||
wallet.sync()
|
||||
cleanupTestDataDir()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun walletNewAddress() {
|
||||
val blockchainConfig = ElectrumConfig("ssl://electrum.blockstream.info:60002", null, 5, 30)
|
||||
val databaseConfig = MemoryConfig()
|
||||
val wallet = Wallet(desc, change, blockchainConfig, databaseConfig)
|
||||
assertNotNull(wallet)
|
||||
val address = wallet.getAddress()
|
||||
assertNotNull(address)
|
||||
log.debug("address created from kotlin: $address")
|
||||
// log.debug("address created from kotlin: $address")
|
||||
assertEquals(address, "tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun walletUnspent() {
|
||||
val wallet = Wallet(desc, change, blockchainConfig, databaseConfig)
|
||||
wallet.sync()
|
||||
val unspent = wallet.listUnspent()
|
||||
assertTrue(unspent.isNotEmpty())
|
||||
|
||||
unspent.iterator().forEach {
|
||||
//log.debug("unspent.outpoint.txid: ${it.outpoint!!.txid}")
|
||||
assertNotNull(it.outpoint?.txid)
|
||||
//log.debug("unspent.outpoint.vout: ${it.outpoint?.vout}")
|
||||
assertTrue(it.outpoint?.vout!! >= 0)
|
||||
//log.debug("unspent.txout.value: ${it.txout?.value}")
|
||||
assertTrue(it.txout?.value!! > 0)
|
||||
//log.debug("unspent.txout.script_pubkey: ${it.txout?.script_pubkey}")
|
||||
assertNotNull(it.txout?.script_pubkey)
|
||||
//log.debug("unspent.keychain: ${it.keychain}")
|
||||
assertTrue(it.keychain!! >= 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user