diff --git a/bindings/c-ffi/src/lib.rs b/bindings/c-ffi/src/lib.rs index ece0586..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, @@ -336,6 +397,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..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, @@ -519,6 +585,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,