From 135729dc2196107a0f883635473d3b1021e7ca81 Mon Sep 17 00:00:00 2001 From: Shashank Date: Tue, 23 Dec 2025 10:05:23 +0530 Subject: [PATCH 1/2] Add send_begin and send_end methods to C FFI bindings --- bindings/c-ffi/src/lib.rs | 30 ++++++++++++++++++++++++++++++ bindings/c-ffi/src/utils.rs | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/bindings/c-ffi/src/lib.rs b/bindings/c-ffi/src/lib.rs index ece0586..4295688 100644 --- a/bindings/c-ffi/src/lib.rs +++ b/bindings/c-ffi/src/lib.rs @@ -336,6 +336,36 @@ pub extern "C" fn rgblib_send( .into() } +#[unsafe(no_mangle)] +pub extern "C" fn rgblib_send_begin( + wallet: &COpaqueStruct, + online: &COpaqueStruct, + recipient_map: *const c_char, + donation: bool, + fee_rate: *const c_char, + min_confirmations: *const c_char, +) -> CResultString { + send_begin( + wallet, + online, + recipient_map, + donation, + fee_rate, + min_confirmations, + ) + .into() +} + +#[unsafe(no_mangle)] +pub extern "C" fn rgblib_send_end( + wallet: &COpaqueStruct, + online: &COpaqueStruct, + signed_psbt: *const c_char, + skip_sync: bool, +) -> CResultString { + send_end(wallet, online, signed_psbt, skip_sync).into() +} + #[unsafe(no_mangle)] pub extern "C" fn rgblib_send_btc( wallet: &COpaqueStruct, diff --git a/bindings/c-ffi/src/utils.rs b/bindings/c-ffi/src/utils.rs index 031f92d..b6e15df 100644 --- a/bindings/c-ffi/src/utils.rs +++ b/bindings/c-ffi/src/utils.rs @@ -519,6 +519,43 @@ pub(crate) fn send( Ok(serde_json::to_string(&res)?) } +pub(crate) fn send_begin( + wallet: &COpaqueStruct, + online: &COpaqueStruct, + recipient_map: *const c_char, + donation: bool, + fee_rate: *const c_char, + min_confirmations: *const c_char, +) -> Result { + let wallet = Wallet::from_opaque(wallet)?; + let online = Online::from_opaque(online)?; + let recipient_map: HashMap> = + serde_json::from_str(&ptr_to_string(recipient_map))?; + let fee_rate = ptr_to_num(fee_rate)?; + let min_confirmations = ptr_to_num(min_confirmations)?; + let res = wallet.send_begin( + (*online).clone(), + recipient_map, + donation, + fee_rate, + min_confirmations, + )?; + Ok(res) +} + +pub(crate) fn send_end( + wallet: &COpaqueStruct, + online: &COpaqueStruct, + signed_psbt: *const c_char, + skip_sync: bool, +) -> Result { + let wallet = Wallet::from_opaque(wallet)?; + let online = Online::from_opaque(online)?; + let signed_psbt = ptr_to_string(signed_psbt); + let res = wallet.send_end((*online).clone(), signed_psbt, skip_sync)?; + Ok(serde_json::to_string(&res)?) +} + pub(crate) fn send_btc( wallet: &COpaqueStruct, online: &COpaqueStruct, From a7e0746afbe26493c0f25f9e7ab0f217a8fc1340 Mon Sep 17 00:00:00 2001 From: Shashank Date: Tue, 23 Dec 2025 11:08:42 +0530 Subject: [PATCH 2/2] Add create_utxos_begin, create_utxos_end, delete_transfers, fail_transfers, and get_asset_metadata to C FFI bindings --- bindings/c-ffi/src/lib.rs | 61 ++++++++++++++++++++++++++++++++++ bindings/c-ffi/src/utils.rs | 66 +++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) diff --git a/bindings/c-ffi/src/lib.rs b/bindings/c-ffi/src/lib.rs index 4295688..b47d518 100644 --- a/bindings/c-ffi/src/lib.rs +++ b/bindings/c-ffi/src/lib.rs @@ -104,6 +104,59 @@ pub extern "C" fn rgblib_create_utxos( .into() } +#[unsafe(no_mangle)] +pub extern "C" fn rgblib_create_utxos_begin( + wallet: &COpaqueStruct, + online: &COpaqueStruct, + up_to: bool, + num_opt: *const c_char, + size_opt: *const c_char, + fee_rate: *const c_char, + skip_sync: bool, +) -> CResultString { + create_utxos_begin( + wallet, online, up_to, num_opt, size_opt, fee_rate, skip_sync, + ) + .into() +} + +#[unsafe(no_mangle)] +pub extern "C" fn rgblib_create_utxos_end( + wallet: &COpaqueStruct, + online: &COpaqueStruct, + signed_psbt: *const c_char, + skip_sync: bool, +) -> CResultString { + create_utxos_end(wallet, online, signed_psbt, skip_sync).into() +} + +#[unsafe(no_mangle)] +pub extern "C" fn rgblib_delete_transfers( + wallet: &COpaqueStruct, + batch_transfer_idx_opt: *const c_char, + no_asset_only: bool, +) -> CResultString { + delete_transfers(wallet, batch_transfer_idx_opt, no_asset_only).into() +} + +#[unsafe(no_mangle)] +pub extern "C" fn rgblib_fail_transfers( + wallet: &COpaqueStruct, + online: &COpaqueStruct, + batch_transfer_idx_opt: *const c_char, + no_asset_only: bool, + skip_sync: bool, +) -> CResultString { + fail_transfers( + wallet, + online, + batch_transfer_idx_opt, + no_asset_only, + skip_sync, + ) + .into() +} + #[unsafe(no_mangle)] pub extern "C" fn rgblib_finalize_psbt( wallet: &COpaqueStruct, @@ -130,6 +183,14 @@ pub extern "C" fn rgblib_get_asset_balance( get_asset_balance(wallet, asset_id).into() } +#[unsafe(no_mangle)] +pub extern "C" fn rgblib_get_asset_metadata( + wallet: &COpaqueStruct, + asset_id: *const c_char, +) -> CResultString { + get_asset_metadata(wallet, asset_id).into() +} + #[unsafe(no_mangle)] pub extern "C" fn rgblib_get_btc_balance( wallet: &COpaqueStruct, diff --git a/bindings/c-ffi/src/utils.rs b/bindings/c-ffi/src/utils.rs index b6e15df..25e84e5 100644 --- a/bindings/c-ffi/src/utils.rs +++ b/bindings/c-ffi/src/utils.rs @@ -228,6 +228,72 @@ pub(crate) fn create_utxos( Ok(serde_json::to_string(&res)?) } +pub(crate) fn create_utxos_begin( + wallet: &COpaqueStruct, + online: &COpaqueStruct, + up_to: bool, + num_opt: *const c_char, + size_opt: *const c_char, + fee_rate: *const c_char, + skip_sync: bool, +) -> Result { + let wallet = Wallet::from_opaque(wallet)?; + let online = Online::from_opaque(online)?; + let num = convert_optional_number(num_opt)?; + let size = convert_optional_number(size_opt)?; + let fee_rate = ptr_to_num(fee_rate)?; + let res = wallet.create_utxos_begin((*online).clone(), up_to, num, size, fee_rate, skip_sync)?; + Ok(res) +} + +pub(crate) fn create_utxos_end( + wallet: &COpaqueStruct, + online: &COpaqueStruct, + signed_psbt: *const c_char, + skip_sync: bool, +) -> Result { + let wallet = Wallet::from_opaque(wallet)?; + let online = Online::from_opaque(online)?; + let signed_psbt = ptr_to_string(signed_psbt); + let res = wallet.create_utxos_end((*online).clone(), signed_psbt, skip_sync)?; + Ok(serde_json::to_string(&res)?) +} + +pub(crate) fn delete_transfers( + wallet: &COpaqueStruct, + batch_transfer_idx_opt: *const c_char, + no_asset_only: bool, +) -> Result { + let wallet = Wallet::from_opaque(wallet)?; + let batch_transfer_idx = convert_optional_number(batch_transfer_idx_opt)?; + let res = wallet.delete_transfers(batch_transfer_idx, no_asset_only)?; + Ok(serde_json::to_string(&res)?) +} + +pub(crate) fn fail_transfers( + wallet: &COpaqueStruct, + online: &COpaqueStruct, + batch_transfer_idx_opt: *const c_char, + no_asset_only: bool, + skip_sync: bool, +) -> Result { + let wallet = Wallet::from_opaque(wallet)?; + let online = Online::from_opaque(online)?; + let batch_transfer_idx = convert_optional_number(batch_transfer_idx_opt)?; + let res = wallet.fail_transfers((*online).clone(), batch_transfer_idx, no_asset_only, skip_sync)?; + Ok(serde_json::to_string(&res)?) +} + +pub(crate) fn get_asset_metadata( + wallet: &COpaqueStruct, + asset_id: *const c_char, +) -> Result { + let wallet = Wallet::from_opaque(wallet)?; + let asset_id = ptr_to_string(asset_id); + let res = wallet.get_asset_metadata(asset_id)?; + Ok(serde_json::to_string(&res)?) +} + pub(crate) fn finalize_psbt( wallet: &COpaqueStruct, signed_psbt: *const c_char,