Merge pull request #11 from notmandatory/unify-offline-operations
Share OfflineWalletOperations
This commit is contained in:
		
						commit
						85d803afcf
					
				@ -44,15 +44,15 @@ open class RustBuffer : Structure() {
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
        internal fun alloc(size: Int = 0) = rustCall() { status ->
 | 
			
		||||
            _UniFFILib.INSTANCE.ffi_bdk_3303_rustbuffer_alloc(size, status)
 | 
			
		||||
            _UniFFILib.INSTANCE.ffi_bdk_7046_rustbuffer_alloc(size, status)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal fun free(buf: RustBuffer.ByValue) = rustCall() { status ->
 | 
			
		||||
            _UniFFILib.INSTANCE.ffi_bdk_3303_rustbuffer_free(buf, status)
 | 
			
		||||
            _UniFFILib.INSTANCE.ffi_bdk_7046_rustbuffer_free(buf, status)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal fun reserve(buf: RustBuffer.ByValue, additional: Int) = rustCall() { status ->
 | 
			
		||||
            _UniFFILib.INSTANCE.ffi_bdk_3303_rustbuffer_reserve(buf, additional, status)
 | 
			
		||||
            _UniFFILib.INSTANCE.ffi_bdk_7046_rustbuffer_reserve(buf, additional, status)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -542,55 +542,59 @@ internal interface _UniFFILib : Library {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun ffi_bdk_3303_OfflineWallet_object_free(ptr: Pointer,
 | 
			
		||||
    fun ffi_bdk_7046_OfflineWallet_object_free(ptr: Pointer,
 | 
			
		||||
    uniffi_out_err: RustCallStatus
 | 
			
		||||
    ): Unit
 | 
			
		||||
 | 
			
		||||
    fun bdk_3303_OfflineWallet_new(descriptor: RustBuffer.ByValue,network: RustBuffer.ByValue,database_config: RustBuffer.ByValue,
 | 
			
		||||
    fun bdk_7046_OfflineWallet_new(descriptor: RustBuffer.ByValue,network: RustBuffer.ByValue,database_config: RustBuffer.ByValue,
 | 
			
		||||
    uniffi_out_err: RustCallStatus
 | 
			
		||||
    ): Pointer
 | 
			
		||||
 | 
			
		||||
    fun bdk_3303_OfflineWallet_get_new_address(ptr: Pointer,
 | 
			
		||||
    fun bdk_7046_OfflineWallet_get_new_address(ptr: Pointer,
 | 
			
		||||
    uniffi_out_err: RustCallStatus
 | 
			
		||||
    ): RustBuffer.ByValue
 | 
			
		||||
 | 
			
		||||
    fun ffi_bdk_3303_OnlineWallet_object_free(ptr: Pointer,
 | 
			
		||||
    fun ffi_bdk_7046_OnlineWallet_object_free(ptr: Pointer,
 | 
			
		||||
    uniffi_out_err: RustCallStatus
 | 
			
		||||
    ): Unit
 | 
			
		||||
 | 
			
		||||
    fun bdk_3303_OnlineWallet_new(descriptor: RustBuffer.ByValue,network: RustBuffer.ByValue,database_config: RustBuffer.ByValue,blockchain_config: RustBuffer.ByValue,
 | 
			
		||||
    fun bdk_7046_OnlineWallet_new(descriptor: RustBuffer.ByValue,network: RustBuffer.ByValue,database_config: RustBuffer.ByValue,blockchain_config: RustBuffer.ByValue,
 | 
			
		||||
    uniffi_out_err: RustCallStatus
 | 
			
		||||
    ): Pointer
 | 
			
		||||
 | 
			
		||||
    fun bdk_3303_OnlineWallet_get_network(ptr: Pointer,
 | 
			
		||||
    fun bdk_7046_OnlineWallet_get_new_address(ptr: Pointer,
 | 
			
		||||
    uniffi_out_err: RustCallStatus
 | 
			
		||||
    ): RustBuffer.ByValue
 | 
			
		||||
 | 
			
		||||
    fun bdk_3303_OnlineWallet_sync(ptr: Pointer,progress_update: Long,max_address_param: RustBuffer.ByValue,
 | 
			
		||||
    fun bdk_7046_OnlineWallet_get_network(ptr: Pointer,
 | 
			
		||||
    uniffi_out_err: RustCallStatus
 | 
			
		||||
    ): RustBuffer.ByValue
 | 
			
		||||
 | 
			
		||||
    fun bdk_7046_OnlineWallet_sync(ptr: Pointer,progress_update: Long,max_address_param: RustBuffer.ByValue,
 | 
			
		||||
    uniffi_out_err: RustCallStatus
 | 
			
		||||
    ): Unit
 | 
			
		||||
 | 
			
		||||
    fun bdk_3303_OnlineWallet_get_balance(ptr: Pointer,
 | 
			
		||||
    fun bdk_7046_OnlineWallet_get_balance(ptr: Pointer,
 | 
			
		||||
    uniffi_out_err: RustCallStatus
 | 
			
		||||
    ): Long
 | 
			
		||||
 | 
			
		||||
    fun ffi_bdk_3303_BdkProgress_init_callback(callback_stub: ForeignCallback,
 | 
			
		||||
    fun ffi_bdk_7046_BdkProgress_init_callback(callback_stub: ForeignCallback,
 | 
			
		||||
    uniffi_out_err: RustCallStatus
 | 
			
		||||
    ): Unit
 | 
			
		||||
 | 
			
		||||
    fun ffi_bdk_3303_rustbuffer_alloc(size: Int,
 | 
			
		||||
    fun ffi_bdk_7046_rustbuffer_alloc(size: Int,
 | 
			
		||||
    uniffi_out_err: RustCallStatus
 | 
			
		||||
    ): RustBuffer.ByValue
 | 
			
		||||
 | 
			
		||||
    fun ffi_bdk_3303_rustbuffer_from_bytes(bytes: ForeignBytes.ByValue,
 | 
			
		||||
    fun ffi_bdk_7046_rustbuffer_from_bytes(bytes: ForeignBytes.ByValue,
 | 
			
		||||
    uniffi_out_err: RustCallStatus
 | 
			
		||||
    ): RustBuffer.ByValue
 | 
			
		||||
 | 
			
		||||
    fun ffi_bdk_3303_rustbuffer_free(buf: RustBuffer.ByValue,
 | 
			
		||||
    fun ffi_bdk_7046_rustbuffer_free(buf: RustBuffer.ByValue,
 | 
			
		||||
    uniffi_out_err: RustCallStatus
 | 
			
		||||
    ): Unit
 | 
			
		||||
 | 
			
		||||
    fun ffi_bdk_3303_rustbuffer_reserve(buf: RustBuffer.ByValue,additional: Int,
 | 
			
		||||
    fun ffi_bdk_7046_rustbuffer_reserve(buf: RustBuffer.ByValue,additional: Int,
 | 
			
		||||
    uniffi_out_err: RustCallStatus
 | 
			
		||||
    ): RustBuffer.ByValue
 | 
			
		||||
 | 
			
		||||
@ -1300,7 +1304,7 @@ class OfflineWallet(
 | 
			
		||||
    constructor(descriptor: String, network: Network, databaseConfig: DatabaseConfig ) :
 | 
			
		||||
        this(
 | 
			
		||||
    rustCallWithError(BdkException) { status ->
 | 
			
		||||
    _UniFFILib.INSTANCE.bdk_3303_OfflineWallet_new(descriptor.lower(), network.lower(), databaseConfig.lower() ,status)
 | 
			
		||||
    _UniFFILib.INSTANCE.bdk_7046_OfflineWallet_new(descriptor.lower(), network.lower(), databaseConfig.lower() ,status)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@ -1313,7 +1317,7 @@ class OfflineWallet(
 | 
			
		||||
     */
 | 
			
		||||
    override protected fun freeRustArcPtr() {
 | 
			
		||||
        rustCall() { status ->
 | 
			
		||||
            _UniFFILib.INSTANCE.ffi_bdk_3303_OfflineWallet_object_free(this.pointer, status)
 | 
			
		||||
            _UniFFILib.INSTANCE.ffi_bdk_7046_OfflineWallet_object_free(this.pointer, status)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1328,7 +1332,7 @@ class OfflineWallet(
 | 
			
		||||
    override fun getNewAddress(): String =
 | 
			
		||||
        callWithPointer {
 | 
			
		||||
    rustCall() { status ->
 | 
			
		||||
    _UniFFILib.INSTANCE.bdk_3303_OfflineWallet_get_new_address(it,  status)
 | 
			
		||||
    _UniFFILib.INSTANCE.bdk_7046_OfflineWallet_get_new_address(it,  status)
 | 
			
		||||
}
 | 
			
		||||
        }.let {
 | 
			
		||||
            String.lift(it)
 | 
			
		||||
@ -1353,6 +1357,7 @@ class OfflineWallet(
 | 
			
		||||
 | 
			
		||||
@ExperimentalUnsignedTypes
 | 
			
		||||
public interface OnlineWalletInterface {
 | 
			
		||||
    fun getNewAddress(): String
 | 
			
		||||
    fun getNetwork(): Network
 | 
			
		||||
    fun sync(progressUpdate: BdkProgress, maxAddressParam: UInt? )
 | 
			
		||||
    fun getBalance(): ULong
 | 
			
		||||
@ -1366,7 +1371,7 @@ class OnlineWallet(
 | 
			
		||||
    constructor(descriptor: String, network: Network, databaseConfig: DatabaseConfig, blockchainConfig: BlockchainConfig ) :
 | 
			
		||||
        this(
 | 
			
		||||
    rustCallWithError(BdkException) { status ->
 | 
			
		||||
    _UniFFILib.INSTANCE.bdk_3303_OnlineWallet_new(descriptor.lower(), network.lower(), databaseConfig.lower(), blockchainConfig.lower() ,status)
 | 
			
		||||
    _UniFFILib.INSTANCE.bdk_7046_OnlineWallet_new(descriptor.lower(), network.lower(), databaseConfig.lower(), blockchainConfig.lower() ,status)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@ -1379,7 +1384,7 @@ class OnlineWallet(
 | 
			
		||||
     */
 | 
			
		||||
    override protected fun freeRustArcPtr() {
 | 
			
		||||
        rustCall() { status ->
 | 
			
		||||
            _UniFFILib.INSTANCE.ffi_bdk_3303_OnlineWallet_object_free(this.pointer, status)
 | 
			
		||||
            _UniFFILib.INSTANCE.ffi_bdk_7046_OnlineWallet_object_free(this.pointer, status)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1391,10 +1396,19 @@ class OnlineWallet(
 | 
			
		||||
        buf.putLong(Pointer.nativeValue(this.lower()))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun getNewAddress(): String =
 | 
			
		||||
        callWithPointer {
 | 
			
		||||
    rustCall() { status ->
 | 
			
		||||
    _UniFFILib.INSTANCE.bdk_7046_OnlineWallet_get_new_address(it,  status)
 | 
			
		||||
}
 | 
			
		||||
        }.let {
 | 
			
		||||
            String.lift(it)
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
    override fun getNetwork(): Network =
 | 
			
		||||
        callWithPointer {
 | 
			
		||||
    rustCall() { status ->
 | 
			
		||||
    _UniFFILib.INSTANCE.bdk_3303_OnlineWallet_get_network(it,  status)
 | 
			
		||||
    _UniFFILib.INSTANCE.bdk_7046_OnlineWallet_get_network(it,  status)
 | 
			
		||||
}
 | 
			
		||||
        }.let {
 | 
			
		||||
            Network.lift(it)
 | 
			
		||||
@ -1403,14 +1417,14 @@ class OnlineWallet(
 | 
			
		||||
    override fun sync(progressUpdate: BdkProgress, maxAddressParam: UInt? ) =
 | 
			
		||||
        callWithPointer {
 | 
			
		||||
    rustCallWithError(BdkException) { status ->
 | 
			
		||||
    _UniFFILib.INSTANCE.bdk_3303_OnlineWallet_sync(it, CallbackInterfaceBdkProgressInternals.lower(progressUpdate), lowerOptionalu32(maxAddressParam) , status)
 | 
			
		||||
    _UniFFILib.INSTANCE.bdk_7046_OnlineWallet_sync(it, CallbackInterfaceBdkProgressInternals.lower(progressUpdate), lowerOptionalu32(maxAddressParam) , status)
 | 
			
		||||
}
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
    override fun getBalance(): ULong =
 | 
			
		||||
        callWithPointer {
 | 
			
		||||
    rustCallWithError(BdkException) { status ->
 | 
			
		||||
    _UniFFILib.INSTANCE.bdk_3303_OnlineWallet_get_balance(it,  status)
 | 
			
		||||
    _UniFFILib.INSTANCE.bdk_7046_OnlineWallet_get_balance(it,  status)
 | 
			
		||||
}
 | 
			
		||||
        }.let {
 | 
			
		||||
            ULong.lift(it)
 | 
			
		||||
@ -1482,7 +1496,7 @@ internal object CallbackInterfaceBdkProgressInternals: CallbackInternals<BdkProg
 | 
			
		||||
) {
 | 
			
		||||
    override fun register(lib: _UniFFILib) {
 | 
			
		||||
        rustCall() { status ->
 | 
			
		||||
            lib.ffi_bdk_3303_BdkProgress_init_callback(this.foreignCallback, status)
 | 
			
		||||
            lib.ffi_bdk_7046_BdkProgress_init_callback(this.foreignCallback, status)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -98,6 +98,7 @@ callback interface BdkProgress {
 | 
			
		||||
interface OnlineWallet {
 | 
			
		||||
    [Throws=BdkError]
 | 
			
		||||
    constructor(string descriptor, Network network, DatabaseConfig database_config, BlockchainConfig blockchain_config);
 | 
			
		||||
    string get_new_address();
 | 
			
		||||
    Network get_network();
 | 
			
		||||
    [Throws=BdkError]
 | 
			
		||||
    void sync(BdkProgress progress_update, u32? max_address_param);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										42
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								src/lib.rs
									
									
									
									
									
								
							@ -10,7 +10,7 @@ use bdk::wallet::AddressIndex;
 | 
			
		||||
use bdk::Error;
 | 
			
		||||
use bdk::Wallet;
 | 
			
		||||
use std::convert::TryFrom;
 | 
			
		||||
use std::sync::Mutex;
 | 
			
		||||
use std::sync::{Mutex, MutexGuard};
 | 
			
		||||
 | 
			
		||||
uniffi_macros::include_scaffolding!("bdk");
 | 
			
		||||
 | 
			
		||||
@ -42,10 +42,30 @@ pub enum BlockchainConfig {
 | 
			
		||||
    Esplora { config: EsploraConfig },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
trait WalletHolder<B> {
 | 
			
		||||
    fn get_wallet(&self) -> MutexGuard<Wallet<B, AnyDatabase>>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct OfflineWallet {
 | 
			
		||||
    wallet: Mutex<Wallet<(), AnyDatabase>>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl WalletHolder<()> for OfflineWallet {
 | 
			
		||||
    fn get_wallet(&self) -> MutexGuard<Wallet<(), AnyDatabase>> {
 | 
			
		||||
        self.wallet.lock().unwrap()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
trait OfflineWalletOperations<B>: WalletHolder<B> {
 | 
			
		||||
    fn get_new_address(&self) -> String {
 | 
			
		||||
        self.get_wallet()
 | 
			
		||||
            .get_address(AddressIndex::New)
 | 
			
		||||
            .unwrap()
 | 
			
		||||
            .address
 | 
			
		||||
            .to_string()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl OfflineWallet {
 | 
			
		||||
    fn new(
 | 
			
		||||
        descriptor: String,
 | 
			
		||||
@ -60,18 +80,10 @@ impl OfflineWallet {
 | 
			
		||||
        let wallet = Mutex::new(Wallet::new_offline(&descriptor, None, network, database)?);
 | 
			
		||||
        Ok(OfflineWallet { wallet })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn get_new_address(&self) -> String {
 | 
			
		||||
        self.wallet
 | 
			
		||||
            .lock()
 | 
			
		||||
            .unwrap()
 | 
			
		||||
            .get_address(AddressIndex::New)
 | 
			
		||||
            .unwrap()
 | 
			
		||||
            .address
 | 
			
		||||
            .to_string()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl OfflineWalletOperations<()> for OfflineWallet {}
 | 
			
		||||
 | 
			
		||||
struct OnlineWallet {
 | 
			
		||||
    wallet: Mutex<Wallet<AnyBlockchain, AnyDatabase>>,
 | 
			
		||||
}
 | 
			
		||||
@ -155,5 +167,13 @@ impl OnlineWallet {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl WalletHolder<AnyBlockchain> for OnlineWallet {
 | 
			
		||||
    fn get_wallet(&self) -> MutexGuard<Wallet<AnyBlockchain, AnyDatabase>> {
 | 
			
		||||
        self.wallet.lock().unwrap()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl OfflineWalletOperations<AnyBlockchain> for OnlineWallet {}
 | 
			
		||||
 | 
			
		||||
uniffi::deps::static_assertions::assert_impl_all!(OfflineWallet: Sync, Send);
 | 
			
		||||
uniffi::deps::static_assertions::assert_impl_all!(OnlineWallet: Sync, Send);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user