summaryrefslogtreecommitdiff
path: root/impls/monero.rs/src
diff options
context:
space:
mode:
Diffstat (limited to 'impls/monero.rs/src')
-rw-r--r--impls/monero.rs/src/bindings.rs1621
-rw-r--r--impls/monero.rs/src/lib.rs450
2 files changed, 2071 insertions, 0 deletions
diff --git a/impls/monero.rs/src/bindings.rs b/impls/monero.rs/src/bindings.rs
new file mode 100644
index 0000000..556f5ad
--- /dev/null
+++ b/impls/monero.rs/src/bindings.rs
@@ -0,0 +1,1621 @@
+#![allow(non_upper_case_globals)]
+#![allow(dead_code)]
+/* automatically generated by rust-bindgen 0.70.1 */
+
+pub const MONERO_wallet2_api_c_h_sha256: &[u8; 65] =
+ b"e8db0ef0324a153f5e3ecca4c0db23c54f4576e84988f04bd4f11c1142f9d7ad\0";
+pub const MONERO_wallet2_api_c_cpp_sha256 : & [u8 ; 106] = b"dca52ac9ee009fda9fb5726543a454885e61d8eb74fb33112288029ed625bec5-b089f9ee69924882c5d14dd1a6991deb05d9d1cd\0" ;
+pub const MONERO_wallet2_api_c_exp_sha256: &[u8; 65] =
+ b"c8913ac41068f67b57c9b0a3c7dd8973e3c1273b66c2ff0aadb0003931da748c\0";
+pub const NetworkType_MAINNET: ::std::os::raw::c_int = 0;
+pub const NetworkType_TESTNET: ::std::os::raw::c_int = 1;
+pub const NetworkType_STAGENET: ::std::os::raw::c_int = 2;
+pub const PendingTransactionStatus_Ok: ::std::os::raw::c_int = 0;
+pub const PendingTransactionStatus_Error: ::std::os::raw::c_int = 1;
+pub const PendingTransactionStatus_Critical: ::std::os::raw::c_int = 2;
+pub const Priority_Default: ::std::os::raw::c_int = 0;
+pub const Priority_Low: ::std::os::raw::c_int = 1;
+pub const Priority_Medium: ::std::os::raw::c_int = 2;
+pub const Priority_High: ::std::os::raw::c_int = 3;
+pub const Priority_Last: ::std::os::raw::c_int = 4;
+extern "C" {
+ pub fn MONERO_PendingTransaction_status(
+ pendingTx_ptr: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_PendingTransaction_errorString(
+ pendingTx_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_PendingTransaction_commit(
+ pendingTx_ptr: *mut ::std::os::raw::c_void,
+ filename: *const ::std::os::raw::c_char,
+ overwrite: bool,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_PendingTransaction_commitUR(
+ pendingTx_ptr: *mut ::std::os::raw::c_void,
+ max_fragment_length: ::std::os::raw::c_int,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_PendingTransaction_amount(pendingTx_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_PendingTransaction_dust(pendingTx_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_PendingTransaction_fee(pendingTx_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_PendingTransaction_txid(
+ pendingTx_ptr: *mut ::std::os::raw::c_void,
+ separator: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_PendingTransaction_txCount(pendingTx_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_PendingTransaction_subaddrAccount(
+ pendingTx_ptr: *mut ::std::os::raw::c_void,
+ separator: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_PendingTransaction_subaddrIndices(
+ pendingTx_ptr: *mut ::std::os::raw::c_void,
+ separator: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_PendingTransaction_multisigSignData(
+ pendingTx_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_PendingTransaction_signMultisigTx(pendingTx_ptr: *mut ::std::os::raw::c_void);
+}
+extern "C" {
+ pub fn MONERO_PendingTransaction_signersKeys(
+ pendingTx_ptr: *mut ::std::os::raw::c_void,
+ separator: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_PendingTransaction_hex(
+ pendingTx_ptr: *mut ::std::os::raw::c_void,
+ separator: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+pub const UnsignedTransactionStatus_Ok: ::std::os::raw::c_int = 0;
+pub const UnsignedTransactionStatus_Error: ::std::os::raw::c_int = 1;
+pub const UnsignedTransactionStatus_Critical: ::std::os::raw::c_int = 2;
+extern "C" {
+ pub fn MONERO_UnsignedTransaction_status(
+ unsignedTx_ptr: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_UnsignedTransaction_errorString(
+ unsignedTx_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_UnsignedTransaction_amount(
+ unsignedTx_ptr: *mut ::std::os::raw::c_void,
+ separator: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_UnsignedTransaction_fee(
+ unsignedTx_ptr: *mut ::std::os::raw::c_void,
+ separator: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_UnsignedTransaction_mixin(
+ unsignedTx_ptr: *mut ::std::os::raw::c_void,
+ separator: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_UnsignedTransaction_confirmationMessage(
+ unsignedTx_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_UnsignedTransaction_paymentId(
+ unsignedTx_ptr: *mut ::std::os::raw::c_void,
+ separator: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_UnsignedTransaction_recipientAddress(
+ unsignedTx_ptr: *mut ::std::os::raw::c_void,
+ separator: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_UnsignedTransaction_minMixinCount(
+ unsignedTx_ptr: *mut ::std::os::raw::c_void,
+ ) -> u64;
+}
+extern "C" {
+ pub fn MONERO_UnsignedTransaction_txCount(unsignedTx_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_UnsignedTransaction_sign(
+ unsignedTx_ptr: *mut ::std::os::raw::c_void,
+ signedFileName: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_UnsignedTransaction_signUR(
+ unsignedTx_ptr: *mut ::std::os::raw::c_void,
+ max_fragment_length: ::std::os::raw::c_int,
+ ) -> *const ::std::os::raw::c_char;
+}
+pub const TransactionInfoDirection_In: ::std::os::raw::c_int = 0;
+pub const TransactionInfoDirection_Out: ::std::os::raw::c_int = 1;
+extern "C" {
+ pub fn MONERO_TransactionInfo_direction(
+ txInfo_ptr: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_isPending(txInfo_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_isFailed(txInfo_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_isCoinbase(txInfo_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_amount(txInfo_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_fee(txInfo_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_blockHeight(txInfo_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_description(
+ txInfo_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_subaddrIndex(
+ txInfo_ptr: *mut ::std::os::raw::c_void,
+ separator: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_subaddrAccount(txInfo_ptr: *mut ::std::os::raw::c_void) -> u32;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_label(
+ txInfo_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_confirmations(txInfo_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_unlockTime(txInfo_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_hash(
+ txInfo_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_timestamp(txInfo_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_paymentId(
+ txInfo_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_transfers_count(
+ txInfo_ptr: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_transfers_amount(
+ txInfo_ptr: *mut ::std::os::raw::c_void,
+ index: ::std::os::raw::c_int,
+ ) -> u64;
+}
+extern "C" {
+ pub fn MONERO_TransactionInfo_transfers_address(
+ txInfo_ptr: *mut ::std::os::raw::c_void,
+ address: ::std::os::raw::c_int,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_TransactionHistory_count(
+ txHistory_ptr: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_TransactionHistory_transaction(
+ txHistory_ptr: *mut ::std::os::raw::c_void,
+ index: ::std::os::raw::c_int,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_TransactionHistory_transactionById(
+ txHistory_ptr: *mut ::std::os::raw::c_void,
+ id: *const ::std::os::raw::c_char,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_TransactionHistory_refresh(txHistory_ptr: *mut ::std::os::raw::c_void);
+}
+extern "C" {
+ pub fn MONERO_TransactionHistory_setTxNote(
+ txHistory_ptr: *mut ::std::os::raw::c_void,
+ txid: *const ::std::os::raw::c_char,
+ note: *const ::std::os::raw::c_char,
+ );
+}
+extern "C" {
+ pub fn MONERO_AddressBookRow_extra(
+ addressBookRow_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_AddressBookRow_getAddress(
+ addressBookRow_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_AddressBookRow_getDescription(
+ addressBookRow_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_AddressBookRow_getPaymentId(
+ addressBookRow_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_AddressBookRow_getRowId(addressBookRow_ptr: *mut ::std::os::raw::c_void)
+ -> usize;
+}
+pub const AddressBookErrorCodeStatus_Ok: ::std::os::raw::c_int = 0;
+pub const AddressBookErrorCodeGeneral_Error: ::std::os::raw::c_int = 1;
+pub const AddressBookErrorCodeInvalid_Address: ::std::os::raw::c_int = 2;
+pub const AddressBookErrorCodeInvalidPaymentId: ::std::os::raw::c_int = 3;
+extern "C" {
+ pub fn MONERO_AddressBook_getAll_size(
+ addressBook_ptr: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_AddressBook_getAll_byIndex(
+ addressBook_ptr: *mut ::std::os::raw::c_void,
+ index: ::std::os::raw::c_int,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_AddressBook_addRow(
+ addressBook_ptr: *mut ::std::os::raw::c_void,
+ dst_addr: *const ::std::os::raw::c_char,
+ payment_id: *const ::std::os::raw::c_char,
+ description: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_AddressBook_deleteRow(
+ addressBook_ptr: *mut ::std::os::raw::c_void,
+ rowId: usize,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_AddressBook_setDescription(
+ addressBook_ptr: *mut ::std::os::raw::c_void,
+ rowId: usize,
+ description: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_AddressBook_refresh(addressBook_ptr: *mut ::std::os::raw::c_void);
+}
+extern "C" {
+ pub fn MONERO_AddressBook_errorString(
+ addressBook_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_AddressBook_errorCode(
+ addressBook_ptr: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_AddressBook_lookupPaymentID(
+ addressBook_ptr: *mut ::std::os::raw::c_void,
+ payment_id: *const ::std::os::raw::c_char,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_blockHeight(coinsInfo_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_hash(
+ coinsInfo_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_internalOutputIndex(
+ coinsInfo_ptr: *mut ::std::os::raw::c_void,
+ ) -> usize;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_globalOutputIndex(coinsInfo_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_spent(coinsInfo_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_frozen(coinsInfo_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_spentHeight(coinsInfo_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_amount(coinsInfo_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_rct(coinsInfo_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_keyImageKnown(coinsInfo_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_pkIndex(coinsInfo_ptr: *mut ::std::os::raw::c_void) -> usize;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_subaddrIndex(coinsInfo_ptr: *mut ::std::os::raw::c_void) -> u32;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_subaddrAccount(coinsInfo_ptr: *mut ::std::os::raw::c_void) -> u32;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_address(
+ coinsInfo_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_addressLabel(
+ coinsInfo_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_keyImage(
+ coinsInfo_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_unlockTime(coinsInfo_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_unlocked(coinsInfo_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_pubKey(
+ coinsInfo_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_coinbase(coinsInfo_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_CoinsInfo_description(
+ coinsInfo_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Coins_count(coins_ptr: *mut ::std::os::raw::c_void) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_Coins_coin(
+ coins_ptr: *mut ::std::os::raw::c_void,
+ index: ::std::os::raw::c_int,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_Coins_getAll_size(
+ coins_ptr: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_Coins_getAll_byIndex(
+ coins_ptr: *mut ::std::os::raw::c_void,
+ index: ::std::os::raw::c_int,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_Coins_refresh(coins_ptr: *mut ::std::os::raw::c_void);
+}
+extern "C" {
+ pub fn MONERO_Coins_setFrozenByPublicKey(
+ coins_ptr: *mut ::std::os::raw::c_void,
+ public_key: *const ::std::os::raw::c_char,
+ );
+}
+extern "C" {
+ pub fn MONERO_Coins_setFrozen(
+ coins_ptr: *mut ::std::os::raw::c_void,
+ index: ::std::os::raw::c_int,
+ );
+}
+extern "C" {
+ pub fn MONERO_Coins_thaw(coins_ptr: *mut ::std::os::raw::c_void, index: ::std::os::raw::c_int);
+}
+extern "C" {
+ pub fn MONERO_Coins_thawByPublicKey(
+ coins_ptr: *mut ::std::os::raw::c_void,
+ public_key: *const ::std::os::raw::c_char,
+ );
+}
+extern "C" {
+ pub fn MONERO_Coins_isTransferUnlocked(
+ coins_ptr: *mut ::std::os::raw::c_void,
+ unlockTime: u64,
+ blockHeight: u64,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Coins_setDescription(
+ coins_ptr: *mut ::std::os::raw::c_void,
+ public_key: *const ::std::os::raw::c_char,
+ description: *const ::std::os::raw::c_char,
+ );
+}
+extern "C" {
+ pub fn MONERO_SubaddressRow_extra(
+ subaddressRow_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_SubaddressRow_getAddress(
+ subaddressRow_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_SubaddressRow_getLabel(
+ subaddressRow_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_SubaddressRow_getRowId(subaddressRow_ptr: *mut ::std::os::raw::c_void) -> usize;
+}
+extern "C" {
+ pub fn MONERO_Subaddress_getAll_size(
+ subaddress_ptr: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_Subaddress_getAll_byIndex(
+ subaddress_ptr: *mut ::std::os::raw::c_void,
+ index: ::std::os::raw::c_int,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_Subaddress_addRow(
+ subaddress_ptr: *mut ::std::os::raw::c_void,
+ accountIndex: u32,
+ label: *const ::std::os::raw::c_char,
+ );
+}
+extern "C" {
+ pub fn MONERO_Subaddress_setLabel(
+ subaddress_ptr: *mut ::std::os::raw::c_void,
+ accountIndex: u32,
+ addressIndex: u32,
+ label: *const ::std::os::raw::c_char,
+ );
+}
+extern "C" {
+ pub fn MONERO_Subaddress_refresh(
+ subaddress_ptr: *mut ::std::os::raw::c_void,
+ accountIndex: u32,
+ );
+}
+extern "C" {
+ pub fn MONERO_SubaddressAccountRow_extra(
+ subaddressAccountRow_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_SubaddressAccountRow_getAddress(
+ subaddressAccountRow_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_SubaddressAccountRow_getLabel(
+ subaddressAccountRow_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_SubaddressAccountRow_getBalance(
+ subaddressAccountRow_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_SubaddressAccountRow_getUnlockedBalance(
+ subaddressAccountRow_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_SubaddressAccountRow_getRowId(
+ subaddressAccountRow_ptr: *mut ::std::os::raw::c_void,
+ ) -> usize;
+}
+extern "C" {
+ pub fn MONERO_SubaddressAccount_getAll_size(
+ subaddressAccount_ptr: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_SubaddressAccount_getAll_byIndex(
+ subaddressAccount_ptr: *mut ::std::os::raw::c_void,
+ index: ::std::os::raw::c_int,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_SubaddressAccount_addRow(
+ subaddressAccount_ptr: *mut ::std::os::raw::c_void,
+ label: *const ::std::os::raw::c_char,
+ );
+}
+extern "C" {
+ pub fn MONERO_SubaddressAccount_setLabel(
+ subaddressAccount_ptr: *mut ::std::os::raw::c_void,
+ accountIndex: u32,
+ label: *const ::std::os::raw::c_char,
+ );
+}
+extern "C" {
+ pub fn MONERO_SubaddressAccount_refresh(subaddressAccount_ptr: *mut ::std::os::raw::c_void);
+}
+extern "C" {
+ pub fn MONERO_MultisigState_isMultisig(multisigState_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_MultisigState_isReady(multisigState_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_MultisigState_threshold(multisigState_ptr: *mut ::std::os::raw::c_void) -> u32;
+}
+extern "C" {
+ pub fn MONERO_MultisigState_total(multisigState_ptr: *mut ::std::os::raw::c_void) -> u32;
+}
+extern "C" {
+ pub fn MONERO_DeviceProgress_progress(deviceProgress_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_DeviceProgress_indeterminate(
+ deviceProgress_ptr: *mut ::std::os::raw::c_void,
+ ) -> bool;
+}
+pub const WalletDevice_Software: ::std::os::raw::c_int = 0;
+pub const WalletDevice_Ledger: ::std::os::raw::c_int = 1;
+pub const WalletDevice_Trezor: ::std::os::raw::c_int = 2;
+pub const WalletStatus_Ok: ::std::os::raw::c_int = 0;
+pub const WalletStatus_Error: ::std::os::raw::c_int = 1;
+pub const WalletStatus_Critical: ::std::os::raw::c_int = 2;
+pub const WalletConnectionStatus_Disconnected: ::std::os::raw::c_int = 0;
+pub const WalletConnectionStatus_Connected: ::std::os::raw::c_int = 1;
+pub const WalletConnectionStatus_WrongVersion: ::std::os::raw::c_int = 2;
+pub const WalletBackgroundSync_Off: ::std::os::raw::c_int = 0;
+pub const WalletBackgroundSync_ReusePassword: ::std::os::raw::c_int = 1;
+pub const BackgroundSync_CustomPassword: ::std::os::raw::c_int = 2;
+extern "C" {
+ pub fn MONERO_Wallet_seed(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ seed_offset: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getSeedLanguage(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_setSeedLanguage(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ arg: *const ::std::os::raw::c_char,
+ );
+}
+extern "C" {
+ pub fn MONERO_Wallet_status(wallet_ptr: *mut ::std::os::raw::c_void) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_Wallet_errorString(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_setPassword(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ password: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getPassword(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_setDevicePin(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ pin: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_setDevicePassphrase(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ passphrase: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_address(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ accountIndex: u64,
+ addressIndex: u64,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_path(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_nettype(wallet_ptr: *mut ::std::os::raw::c_void) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_Wallet_useForkRules(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ version: u8,
+ early_blocks: i64,
+ ) -> u8;
+}
+extern "C" {
+ pub fn MONERO_Wallet_integratedAddress(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ payment_id: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_secretViewKey(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_publicViewKey(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_secretSpendKey(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_publicSpendKey(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_publicMultisigSignerKey(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_stop(wallet_ptr: *mut ::std::os::raw::c_void);
+}
+extern "C" {
+ pub fn MONERO_Wallet_store(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ path: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_filename(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_keysFilename(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_init(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ daemon_address: *const ::std::os::raw::c_char,
+ upper_transaction_size_limit: u64,
+ daemon_username: *const ::std::os::raw::c_char,
+ daemon_password: *const ::std::os::raw::c_char,
+ use_ssl: bool,
+ lightWallet: bool,
+ proxy_address: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_createWatchOnly(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ path: *const ::std::os::raw::c_char,
+ password: *const ::std::os::raw::c_char,
+ language: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_setRefreshFromBlockHeight(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ refresh_from_block_height: u64,
+ );
+}
+extern "C" {
+ pub fn MONERO_Wallet_getRefreshFromBlockHeight(wallet_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_setRecoveringFromSeed(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ recoveringFromSeed: bool,
+ );
+}
+extern "C" {
+ pub fn MONERO_Wallet_setRecoveringFromDevice(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ recoveringFromDevice: bool,
+ );
+}
+extern "C" {
+ pub fn MONERO_Wallet_setSubaddressLookahead(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ major: u32,
+ minor: u32,
+ );
+}
+extern "C" {
+ pub fn MONERO_Wallet_connectToDaemon(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_connected(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_Wallet_setTrustedDaemon(wallet_ptr: *mut ::std::os::raw::c_void, arg: bool);
+}
+extern "C" {
+ pub fn MONERO_Wallet_trustedDaemon(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_setProxy(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ address: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_balance(wallet_ptr: *mut ::std::os::raw::c_void, accountIndex: u32)
+ -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_unlockedBalance(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ accountIndex: u32,
+ ) -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_viewOnlyBalance(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ accountIndex: u32,
+ ) -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_watchOnly(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_isDeterministic(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_blockChainHeight(wallet_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_approximateBlockChainHeight(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_estimateBlockChainHeight(wallet_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_daemonBlockChainHeight(wallet_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_daemonBlockChainHeight_cached(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_daemonBlockChainHeight_runThread(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ seconds: ::std::os::raw::c_int,
+ );
+}
+extern "C" {
+ pub fn MONERO_Wallet_daemonBlockChainTargetHeight(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_synchronized(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_displayAmount(amount: u64) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_amountFromString(amount: *const ::std::os::raw::c_char) -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_amountFromDouble(amount: f64) -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_genPaymentId() -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_paymentIdValid(paiment_id: *const ::std::os::raw::c_char) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_addressValid(
+ str_: *const ::std::os::raw::c_char,
+ nettype: ::std::os::raw::c_int,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_keyValid(
+ secret_key_string: *const ::std::os::raw::c_char,
+ address_string: *const ::std::os::raw::c_char,
+ isViewKey: bool,
+ nettype: ::std::os::raw::c_int,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_keyValid_error(
+ secret_key_string: *const ::std::os::raw::c_char,
+ address_string: *const ::std::os::raw::c_char,
+ isViewKey: bool,
+ nettype: ::std::os::raw::c_int,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_paymentIdFromAddress(
+ strarg: *const ::std::os::raw::c_char,
+ nettype: ::std::os::raw::c_int,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_maximumAllowedAmount() -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_init3(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ argv0: *const ::std::os::raw::c_char,
+ default_log_base_name: *const ::std::os::raw::c_char,
+ log_path: *const ::std::os::raw::c_char,
+ console: bool,
+ );
+}
+extern "C" {
+ pub fn MONERO_Wallet_getPolyseed(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ passphrase: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_createPolyseed(
+ language: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_startRefresh(wallet_ptr: *mut ::std::os::raw::c_void);
+}
+extern "C" {
+ pub fn MONERO_Wallet_pauseRefresh(wallet_ptr: *mut ::std::os::raw::c_void);
+}
+extern "C" {
+ pub fn MONERO_Wallet_refresh(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_refreshAsync(wallet_ptr: *mut ::std::os::raw::c_void);
+}
+extern "C" {
+ pub fn MONERO_Wallet_rescanBlockchain(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_rescanBlockchainAsync(wallet_ptr: *mut ::std::os::raw::c_void);
+}
+extern "C" {
+ pub fn MONERO_Wallet_setAutoRefreshInterval(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ millis: ::std::os::raw::c_int,
+ );
+}
+extern "C" {
+ pub fn MONERO_Wallet_autoRefreshInterval(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_Wallet_addSubaddressAccount(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ label: *const ::std::os::raw::c_char,
+ );
+}
+extern "C" {
+ pub fn MONERO_Wallet_numSubaddressAccounts(wallet_ptr: *mut ::std::os::raw::c_void) -> usize;
+}
+extern "C" {
+ pub fn MONERO_Wallet_numSubaddresses(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ accountIndex: u32,
+ ) -> usize;
+}
+extern "C" {
+ pub fn MONERO_Wallet_addSubaddress(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ accountIndex: u32,
+ label: *const ::std::os::raw::c_char,
+ );
+}
+extern "C" {
+ pub fn MONERO_Wallet_getSubaddressLabel(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ accountIndex: u32,
+ addressIndex: u32,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_setSubaddressLabel(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ accountIndex: u32,
+ addressIndex: u32,
+ label: *const ::std::os::raw::c_char,
+ );
+}
+extern "C" {
+ pub fn MONERO_Wallet_multisig(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getMultisigInfo(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_makeMultisig(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ info: *const ::std::os::raw::c_char,
+ info_separator: *const ::std::os::raw::c_char,
+ threshold: u32,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_exchangeMultisigKeys(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ info: *const ::std::os::raw::c_char,
+ info_separator: *const ::std::os::raw::c_char,
+ force_update_use_with_caution: bool,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_exportMultisigImages(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ separator: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_importMultisigImages(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ info: *const ::std::os::raw::c_char,
+ info_separator: *const ::std::os::raw::c_char,
+ ) -> usize;
+}
+extern "C" {
+ pub fn MONERO_Wallet_hasMultisigPartialKeyImages(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> usize;
+}
+extern "C" {
+ pub fn MONERO_Wallet_restoreMultisigTransaction(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ signData: *const ::std::os::raw::c_char,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_Wallet_createTransactionMultDest(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ dst_addr_list: *const ::std::os::raw::c_char,
+ dst_addr_list_separator: *const ::std::os::raw::c_char,
+ payment_id: *const ::std::os::raw::c_char,
+ amount_sweep_all: bool,
+ amount_list: *const ::std::os::raw::c_char,
+ amount_list_separator: *const ::std::os::raw::c_char,
+ mixin_count: u32,
+ pendingTransactionPriority: ::std::os::raw::c_int,
+ subaddr_account: u32,
+ preferredInputs: *const ::std::os::raw::c_char,
+ preferredInputs_separator: *const ::std::os::raw::c_char,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_Wallet_createTransaction(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ dst_addr: *const ::std::os::raw::c_char,
+ payment_id: *const ::std::os::raw::c_char,
+ amount: u64,
+ mixin_count: u32,
+ pendingTransactionPriority: ::std::os::raw::c_int,
+ subaddr_account: u32,
+ preferredInputs: *const ::std::os::raw::c_char,
+ separator: *const ::std::os::raw::c_char,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_Wallet_loadUnsignedTx(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ unsigned_filename: *const ::std::os::raw::c_char,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_Wallet_loadUnsignedTxUR(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ input: *const ::std::os::raw::c_char,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_Wallet_submitTransaction(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ fileName: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_submitTransactionUR(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ input: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_hasUnknownKeyImages(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_exportKeyImages(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ filename: *const ::std::os::raw::c_char,
+ all: bool,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_exportKeyImagesUR(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ max_fragment_length: usize,
+ all: bool,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_importKeyImages(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ filename: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_importKeyImagesUR(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ input: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_exportOutputs(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ filename: *const ::std::os::raw::c_char,
+ all: bool,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_exportOutputsUR(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ max_fragment_length: usize,
+ all: bool,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_importOutputs(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ filename: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_importOutputsUR(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ input: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_setupBackgroundSync(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ background_sync_type: ::std::os::raw::c_int,
+ wallet_password: *const ::std::os::raw::c_char,
+ background_cache_password: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getBackgroundSyncType(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_Wallet_startBackgroundSync(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_stopBackgroundSync(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ wallet_password: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_isBackgroundSyncing(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_isBackgroundWallet(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_history(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_Wallet_addressBook(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_Wallet_coins(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_Wallet_subaddress(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_Wallet_subaddressAccount(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_Wallet_defaultMixin(wallet_ptr: *mut ::std::os::raw::c_void) -> u32;
+}
+extern "C" {
+ pub fn MONERO_Wallet_setDefaultMixin(wallet_ptr: *mut ::std::os::raw::c_void, arg: u32);
+}
+extern "C" {
+ pub fn MONERO_Wallet_setCacheAttribute(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ key: *const ::std::os::raw::c_char,
+ val: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getCacheAttribute(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ key: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_setUserNote(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ txid: *const ::std::os::raw::c_char,
+ note: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getUserNote(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ txid: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getTxKey(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ txid: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_signMessage(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ message: *const ::std::os::raw::c_char,
+ address: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_verifySignedMessage(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ message: *const ::std::os::raw::c_char,
+ address: *const ::std::os::raw::c_char,
+ signature: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_rescanSpent(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_setOffline(wallet_ptr: *mut ::std::os::raw::c_void, offline: bool);
+}
+extern "C" {
+ pub fn MONERO_Wallet_isOffline(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_segregatePreForkOutputs(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ segregate: bool,
+ );
+}
+extern "C" {
+ pub fn MONERO_Wallet_segregationHeight(wallet_ptr: *mut ::std::os::raw::c_void, height: u64);
+}
+extern "C" {
+ pub fn MONERO_Wallet_keyReuseMitigation2(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ mitigation: bool,
+ );
+}
+extern "C" {
+ pub fn MONERO_Wallet_lockKeysFile(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_unlockKeysFile(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_isKeysFileLocked(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getDeviceType(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_Wallet_coldKeyImageSync(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ spent: u64,
+ unspent: u64,
+ ) -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_deviceShowAddress(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ accountIndex: u32,
+ addressIndex: u32,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_Wallet_reconnectDevice(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getBytesReceived(wallet_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getBytesSent(wallet_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getStateIsConnected(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getSendToDevice(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *mut ::std::os::raw::c_uchar;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getSendToDeviceLength(wallet_ptr: *mut ::std::os::raw::c_void) -> usize;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getReceivedFromDevice(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *mut ::std::os::raw::c_uchar;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getReceivedFromDeviceLength(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> usize;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getWaitsForDeviceSend(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_getWaitsForDeviceReceive(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_Wallet_setDeviceReceivedData(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ data: *mut ::std::os::raw::c_uchar,
+ len: usize,
+ );
+}
+extern "C" {
+ pub fn MONERO_Wallet_setDeviceSendData(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ data: *mut ::std::os::raw::c_uchar,
+ len: usize,
+ );
+}
+extern "C" {
+ pub fn MONERO_WalletManager_createWallet(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ path: *const ::std::os::raw::c_char,
+ password: *const ::std::os::raw::c_char,
+ language: *const ::std::os::raw::c_char,
+ networkType: ::std::os::raw::c_int,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_openWallet(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ path: *const ::std::os::raw::c_char,
+ password: *const ::std::os::raw::c_char,
+ networkType: ::std::os::raw::c_int,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_recoveryWallet(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ path: *const ::std::os::raw::c_char,
+ password: *const ::std::os::raw::c_char,
+ mnemonic: *const ::std::os::raw::c_char,
+ networkType: ::std::os::raw::c_int,
+ restoreHeight: u64,
+ kdfRounds: u64,
+ seedOffset: *const ::std::os::raw::c_char,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_createWalletFromKeys(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ path: *const ::std::os::raw::c_char,
+ password: *const ::std::os::raw::c_char,
+ language: *const ::std::os::raw::c_char,
+ nettype: ::std::os::raw::c_int,
+ restoreHeight: u64,
+ addressString: *const ::std::os::raw::c_char,
+ viewKeyString: *const ::std::os::raw::c_char,
+ spendKeyString: *const ::std::os::raw::c_char,
+ kdf_rounds: u64,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_createDeterministicWalletFromSpendKey(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ path: *const ::std::os::raw::c_char,
+ password: *const ::std::os::raw::c_char,
+ language: *const ::std::os::raw::c_char,
+ nettype: ::std::os::raw::c_int,
+ restoreHeight: u64,
+ spendKeyString: *const ::std::os::raw::c_char,
+ kdf_rounds: u64,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_createWalletFromDevice(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ path: *const ::std::os::raw::c_char,
+ password: *const ::std::os::raw::c_char,
+ nettype: ::std::os::raw::c_int,
+ deviceName: *const ::std::os::raw::c_char,
+ restoreHeight: u64,
+ subaddressLookahead: *const ::std::os::raw::c_char,
+ viewKeyString: *const ::std::os::raw::c_char,
+ spendKeyString: *const ::std::os::raw::c_char,
+ kdf_rounds: u64,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_createWalletFromPolyseed(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ path: *const ::std::os::raw::c_char,
+ password: *const ::std::os::raw::c_char,
+ nettype: ::std::os::raw::c_int,
+ mnemonic: *const ::std::os::raw::c_char,
+ passphrase: *const ::std::os::raw::c_char,
+ newWallet: bool,
+ restore_height: u64,
+ kdf_rounds: u64,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_closeWallet(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ store: bool,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_walletExists(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ path: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_verifyWalletPassword(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ keys_file_name: *const ::std::os::raw::c_char,
+ password: *const ::std::os::raw::c_char,
+ no_spend_key: bool,
+ kdf_rounds: u64,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_queryWalletDevice(
+ device_type: ::std::os::raw::c_int,
+ keys_file_name: *const ::std::os::raw::c_char,
+ password: *const ::std::os::raw::c_char,
+ kdf_rounds: u64,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_findWallets(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ path: *const ::std::os::raw::c_char,
+ separator: *const ::std::os::raw::c_char,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_errorString(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_setDaemonAddress(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ address: *const ::std::os::raw::c_char,
+ );
+}
+extern "C" {
+ pub fn MONERO_WalletManager_blockchainHeight(wm_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_blockchainTargetHeight(wm_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_networkDifficulty(wm_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_miningHashRate(wm_ptr: *mut ::std::os::raw::c_void) -> f64;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_blockTarget(wm_ptr: *mut ::std::os::raw::c_void) -> u64;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_isMining(wm_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_startMining(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ address: *const ::std::os::raw::c_char,
+ threads: u32,
+ backgroundMining: bool,
+ ignoreBattery: bool,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_stopMining(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ address: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_resolveOpenAlias(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ address: *const ::std::os::raw::c_char,
+ dnssec_valid: bool,
+ ) -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_WalletManager_setProxy(
+ wm_ptr: *mut ::std::os::raw::c_void,
+ address: *const ::std::os::raw::c_char,
+ ) -> bool;
+}
+pub const LogLevel_Silent: ::std::os::raw::c_int = -1;
+pub const LogLevel_0: ::std::os::raw::c_int = 0;
+pub const LogLevel_1: ::std::os::raw::c_int = 1;
+pub const LogLevel_2: ::std::os::raw::c_int = 2;
+pub const LogLevel_3: ::std::os::raw::c_int = 3;
+pub const LogLevel_4: ::std::os::raw::c_int = 4;
+pub const LogLevel_Min: ::std::os::raw::c_int = -1;
+pub const LogLevel_Max: ::std::os::raw::c_int = 4;
+extern "C" {
+ pub fn MONERO_WalletManagerFactory_getWalletManager() -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_WalletManagerFactory_setLogLevel(level: ::std::os::raw::c_int);
+}
+extern "C" {
+ pub fn MONERO_WalletManagerFactory_setLogCategories(categories: *const ::std::os::raw::c_char);
+}
+extern "C" {
+ pub fn MONERO_DEBUG_test0();
+}
+extern "C" {
+ pub fn MONERO_DEBUG_test1(x: bool) -> bool;
+}
+extern "C" {
+ pub fn MONERO_DEBUG_test2(x: ::std::os::raw::c_int) -> ::std::os::raw::c_int;
+}
+extern "C" {
+ pub fn MONERO_DEBUG_test3(x: u64) -> u64;
+}
+extern "C" {
+ pub fn MONERO_DEBUG_test4(x: u64) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_DEBUG_test5() -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_DEBUG_test5_std() -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_DEBUG_isPointerNull(wallet_ptr: *mut ::std::os::raw::c_void) -> bool;
+}
+extern "C" {
+ pub fn MONERO_cw_getWalletListener(
+ wallet_ptr: *mut ::std::os::raw::c_void,
+ ) -> *mut ::std::os::raw::c_void;
+}
+extern "C" {
+ pub fn MONERO_cw_WalletListener_resetNeedToRefresh(
+ cw_walletListener_ptr: *mut ::std::os::raw::c_void,
+ );
+}
+extern "C" {
+ pub fn MONERO_cw_WalletListener_isNeedToRefresh(
+ cw_walletListener_ptr: *mut ::std::os::raw::c_void,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_cw_WalletListener_isNewTransactionExist(
+ cw_walletListener_ptr: *mut ::std::os::raw::c_void,
+ ) -> bool;
+}
+extern "C" {
+ pub fn MONERO_cw_WalletListener_resetIsNewTransactionExist(
+ cw_walletListener_ptr: *mut ::std::os::raw::c_void,
+ );
+}
+extern "C" {
+ pub fn MONERO_cw_WalletListener_height(
+ cw_walletListener_ptr: *mut ::std::os::raw::c_void,
+ ) -> u64;
+}
+extern "C" {
+ pub fn MONERO_free(ptr: *mut ::std::os::raw::c_void);
+}
+extern "C" {
+ pub fn MONERO_checksum_wallet2_api_c_h() -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_checksum_wallet2_api_c_cpp() -> *const ::std::os::raw::c_char;
+}
+extern "C" {
+ pub fn MONERO_checksum_wallet2_api_c_exp() -> *const ::std::os::raw::c_char;
+}
diff --git a/impls/monero.rs/src/lib.rs b/impls/monero.rs/src/lib.rs
new file mode 100644
index 0000000..77ea240
--- /dev/null
+++ b/impls/monero.rs/src/lib.rs
@@ -0,0 +1,450 @@
+use std::ffi::{CStr, CString};
+use std::os::raw::{c_int, c_void};
+use std::ptr::NonNull;
+use std::sync::Arc;
+
+mod bindings;
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum NetworkType {
+ Mainnet = bindings::NetworkType_MAINNET as isize,
+ Testnet = bindings::NetworkType_TESTNET as isize,
+ Stagenet = bindings::NetworkType_STAGENET as isize,
+}
+
+impl NetworkType {
+ pub fn from_c_int(value: c_int) -> Option<Self> {
+ match value {
+ bindings::NetworkType_MAINNET => Some(NetworkType::Mainnet),
+ bindings::NetworkType_TESTNET => Some(NetworkType::Testnet),
+ bindings::NetworkType_STAGENET => Some(NetworkType::Stagenet),
+ _ => None,
+ }
+ }
+
+ pub fn to_c_int(self) -> c_int {
+ self as c_int
+ }
+}
+
+#[derive(Debug)]
+pub enum WalletError {
+ NullPointer,
+ FfiError(String),
+ WalletErrorCode(c_int, String),
+}
+
+pub type WalletResult<T> = Result<T, WalletError>;
+
+pub struct WalletManager {
+ ptr: NonNull<c_void>,
+}
+
+impl WalletManager {
+ /// Creates a new `WalletManager` using the statically linked `MONERO_WalletManagerFactory_getWalletManager`.
+ ///
+ /// # Example
+ ///
+ /// ```
+ /// use monero_c_rust::WalletManager;
+ /// let manager = WalletManager::new();
+ /// assert!(manager.is_ok());
+ /// ```
+ pub fn new() -> WalletResult<Arc<Self>> {
+ unsafe {
+ let ptr = bindings::MONERO_WalletManagerFactory_getWalletManager();
+ let ptr = NonNull::new(ptr).ok_or(WalletError::NullPointer)?;
+ Ok(Arc::new(WalletManager { ptr }))
+ }
+ }
+
+ /// Creates a new wallet.
+ ///
+ /// # Example
+ ///
+ /// ```
+ /// use monero_c_rust::{WalletManager, NetworkType};
+ /// use std::fs;
+ /// use std::path::Path;
+ ///
+ /// let manager = WalletManager::new().unwrap();
+ /// let wallet = manager.create_wallet("wallet_name", "password", "English", NetworkType::Mainnet);
+ /// assert!(wallet.is_ok());
+ ///
+ /// // Cleanup: remove the wallet file and its corresponding keys file, if they exist.
+ /// if Path::new("wallet_name").exists() {
+ /// fs::remove_file("wallet_name").expect("Failed to delete test wallet");
+ /// }
+ /// if Path::new("wallet_name.keys").exists() {
+ /// fs::remove_file("wallet_name.keys").expect("Failed to delete test wallet keys");
+ /// }
+ /// ```
+ pub fn create_wallet(
+ self: &Arc<Self>,
+ path: &str,
+ password: &str,
+ language: &str,
+ network_type: NetworkType,
+ ) -> WalletResult<Wallet> {
+ let c_path = CString::new(path).map_err(|_| WalletError::FfiError("Invalid path".to_string()))?;
+ let c_password = CString::new(password).map_err(|_| WalletError::FfiError("Invalid password".to_string()))?;
+ let c_language = CString::new(language).map_err(|_| WalletError::FfiError("Invalid language".to_string()))?;
+
+ unsafe {
+ let wallet_ptr = bindings::MONERO_WalletManager_createWallet(
+ self.ptr.as_ptr(),
+ c_path.as_ptr(),
+ c_password.as_ptr(),
+ c_language.as_ptr(),
+ network_type.to_c_int(),
+ );
+
+ NonNull::new(wallet_ptr)
+ .map(|ptr| Wallet { ptr, manager: Arc::clone(self) })
+ .ok_or(WalletError::NullPointer)
+ }
+ }
+}
+
+pub struct Wallet {
+ ptr: NonNull<c_void>,
+ manager: Arc<WalletManager>,
+}
+
+impl Wallet {
+ /// Retrieves the wallet's seed with an optional offset.
+ ///
+ /// # Example
+ ///
+ /// ```
+ /// use monero_c_rust::{WalletManager, NetworkType};
+ /// use tempfile::TempDir;
+ /// use std::fs;
+ ///
+ /// let temp_dir = TempDir::new().expect("Failed to create temporary directory");
+ /// let wallet_path = temp_dir.path().join("wallet_name");
+ /// let wallet_str = wallet_path.to_str().unwrap();
+ ///
+ /// let manager = WalletManager::new().unwrap();
+ /// let wallet_result = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet);
+ /// assert!(wallet_result.is_ok(), "Failed to create wallet: {:?}", wallet_result.err());
+ /// let wallet = wallet_result.unwrap();
+ /// let seed = wallet.get_seed("");
+ /// assert!(seed.is_ok(), "Failed to get seed: {:?}", seed.err());
+ /// let seed = seed.unwrap();
+ /// assert!(!seed.is_empty(), "Seed should not be empty");
+ ///
+ /// // Clean up wallet files.
+ /// fs::remove_file(wallet_str).expect("Failed to delete test wallet");
+ /// fs::remove_file(format!("{}.keys", wallet_str)).expect("Failed to delete test wallet keys");
+ /// ```
+ pub fn get_seed(&self, seed_offset: &str) -> WalletResult<String> {
+ let c_seed_offset = CString::new(seed_offset)
+ .map_err(|_| WalletError::FfiError("Invalid seed_offset".to_string()))?;
+
+ unsafe {
+ let seed_ptr = bindings::MONERO_Wallet_seed(self.ptr.as_ptr(), c_seed_offset.as_ptr());
+ if seed_ptr.is_null() {
+ Err(self.get_last_error())
+ } else {
+ let seed = CStr::from_ptr(seed_ptr)
+ .to_string_lossy()
+ .into_owned();
+ if seed.is_empty() {
+ Err(WalletError::FfiError("Received empty seed".to_string()))
+ } else {
+ Ok(seed)
+ }
+ }
+ }
+ }
+
+ /// Retrieves the wallet's address for the given account and address index.
+ ///
+ /// # Example
+ ///
+ /// ```
+ /// use monero_c_rust::{WalletManager, NetworkType};
+ /// use tempfile::TempDir;
+ /// use std::fs;
+ ///
+ /// let temp_dir = TempDir::new().expect("Failed to create temporary directory");
+ /// let wallet_path = temp_dir.path().join("wallet_name");
+ /// let wallet_str = wallet_path.to_str().unwrap();
+ ///
+ /// let manager = WalletManager::new().unwrap();
+ /// let wallet = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet).unwrap();
+ /// let address = wallet.get_address(0, 0);
+ /// assert!(address.is_ok(), "Failed to get address: {:?}", address.err());
+ ///
+ /// // Clean up wallet files.
+ /// fs::remove_file(wallet_str).expect("Failed to delete test wallet");
+ /// fs::remove_file(format!("{}.keys", wallet_str)).expect("Failed to delete test wallet keys");
+ /// ```
+ pub fn get_address(&self, account_index: u64, address_index: u64) -> WalletResult<String> {
+ unsafe {
+ let address_ptr = bindings::MONERO_Wallet_address(self.ptr.as_ptr(), account_index, address_index);
+ if address_ptr.is_null() {
+ Err(self.get_last_error())
+ } else {
+ let address = CStr::from_ptr(address_ptr)
+ .to_string_lossy()
+ .into_owned();
+ Ok(address)
+ }
+ }
+ }
+
+ /// Checks if the wallet is deterministic.
+ ///
+ /// # Example
+ ///
+ /// ```
+ /// use monero_c_rust::{WalletManager, NetworkType};
+ /// use tempfile::TempDir;
+ /// use std::fs;
+ ///
+ /// let temp_dir = TempDir::new().expect("Failed to create temporary directory");
+ /// let wallet_path = temp_dir.path().join("wallet_name");
+ /// let wallet_str = wallet_path.to_str().unwrap();
+ ///
+ /// let manager = WalletManager::new().unwrap();
+ /// let wallet_result = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet);
+ /// assert!(wallet_result.is_ok(), "Failed to create wallet: {:?}", wallet_result.err());
+ /// let wallet = wallet_result.unwrap();
+ /// let is_deterministic = wallet.is_deterministic();
+ /// assert!(is_deterministic.is_ok(), "Failed to check if wallet is deterministic: {:?}", is_deterministic.err());
+ /// assert!(is_deterministic.unwrap(), "Wallet should be deterministic");
+ ///
+ /// // Clean up wallet files.
+ /// fs::remove_file(wallet_str).expect("Failed to delete test wallet");
+ /// fs::remove_file(format!("{}.keys", wallet_str)).expect("Failed to delete test wallet keys");
+ /// ```
+ pub fn is_deterministic(&self) -> WalletResult<bool> {
+ unsafe {
+ let result = bindings::MONERO_Wallet_isDeterministic(self.ptr.as_ptr());
+ Ok(result)
+ }
+ }
+
+ /// Retrieves the last error from the wallet.
+ ///
+ /// # Example
+ ///
+ /// ```
+ /// use monero_c_rust::{WalletManager, NetworkType, WalletError};
+ /// let manager = WalletManager::new().unwrap();
+ /// // Intentionally pass an invalid wallet to force an error.
+ /// let invalid_wallet = manager.create_wallet("", "", "", NetworkType::Mainnet);
+ /// if let Err(err) = invalid_wallet {
+ /// if let WalletError::WalletErrorCode(_, error_msg) = err {
+ /// // Check that an error message was produced
+ /// assert!(!error_msg.is_empty(), "Error message should not be empty");
+ /// }
+ /// }
+ /// ```
+ pub fn get_last_error(&self) -> WalletError {
+ unsafe {
+ let error_ptr = bindings::MONERO_Wallet_errorString(self.ptr.as_ptr());
+ let status = bindings::MONERO_Wallet_status(self.ptr.as_ptr());
+
+ let error_msg = if error_ptr.is_null() {
+ "Unknown error".to_string()
+ } else {
+ CStr::from_ptr(error_ptr)
+ .to_string_lossy()
+ .into_owned()
+ };
+
+ WalletError::WalletErrorCode(status, error_msg)
+ }
+ }
+}
+
+impl Drop for Wallet {
+ fn drop(&mut self) {
+ unsafe {
+ bindings::MONERO_WalletManager_closeWallet(
+ self.manager.ptr.as_ptr(),
+ self.ptr.as_ptr(),
+ false, // Don't save the wallet by default.
+ );
+ }
+ }
+}
+
+#[cfg(test)]
+use tempfile::TempDir;
+#[cfg(test)]
+use std::fs;
+
+#[cfg(test)]
+fn check_and_delete_existing_wallets(temp_dir: &TempDir) -> std::io::Result<()> {
+ let test_wallet_names = &["wallet_name", "mainnet_wallet", "testnet_wallet", "stagenet_wallet"];
+
+ for name in test_wallet_names {
+ let wallet_file = temp_dir.path().join(name);
+ let keys_file = temp_dir.path().join(format!("{}.keys", name));
+
+ if wallet_file.exists() {
+ fs::remove_file(&wallet_file)?;
+ }
+ if keys_file.exists() {
+ fs::remove_file(&keys_file)?;
+ }
+ }
+ Ok(())
+}
+
+#[cfg(test)]
+fn setup() -> WalletResult<(Arc<WalletManager>, TempDir)> {
+ let temp_dir = tempfile::tempdir().expect("Failed to create temporary directory");
+ check_and_delete_existing_wallets(&temp_dir).expect("Failed to clean up existing wallets");
+
+ let manager = WalletManager::new()?;
+ Ok((manager, temp_dir))
+}
+
+#[cfg(test)]
+fn teardown(temp_dir: &TempDir) -> std::io::Result<()> {
+ check_and_delete_existing_wallets(temp_dir)
+}
+
+#[test]
+fn test_wallet_manager_creation() {
+ let (manager, temp_dir) = setup().expect("Failed to set up test environment");
+
+ let wallet_path = temp_dir.path().join("wallet_name");
+ let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");
+
+ let wallet_result = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet);
+ assert!(wallet_result.is_ok(), "WalletManager creation failed");
+
+ teardown(&temp_dir).expect("Failed to clean up after test");
+}
+
+#[test]
+fn test_wallet_creation() {
+ let (manager, temp_dir) = setup().expect("Failed to set up test environment");
+
+ let wallet_path = temp_dir.path().join("wallet_name");
+ let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");
+
+ let wallet = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet);
+ assert!(wallet.is_ok(), "Failed to create wallet");
+ let wallet = wallet.unwrap();
+ assert!(wallet.is_deterministic().is_ok(), "Wallet creation seems to have failed");
+
+ teardown(&temp_dir).expect("Failed to clean up after test");
+}
+
+#[test]
+fn test_get_seed() {
+ let (manager, temp_dir) = setup().expect("Failed to set up test environment");
+
+ let wallet_path = temp_dir.path().join("wallet_name");
+ let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");
+
+ let wallet = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet).expect("Failed to create wallet");
+ let result = wallet.get_seed("");
+ assert!(result.is_ok(), "Failed to get seed: {:?}", result.err());
+ assert!(!result.unwrap().is_empty(), "Seed is empty");
+
+ teardown(&temp_dir).expect("Failed to clean up after test");
+}
+
+#[test]
+fn test_get_address() {
+ let (manager, temp_dir) = setup().expect("Failed to set up test environment");
+
+ let wallet_path = temp_dir.path().join("wallet_name");
+ let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");
+
+ let wallet = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet).expect("Failed to create wallet");
+ let result = wallet.get_address(0, 0);
+ assert!(result.is_ok(), "Failed to get address: {:?}", result.err());
+ assert!(!result.unwrap().is_empty(), "Address is empty");
+
+ teardown(&temp_dir).expect("Failed to clean up after test");
+}
+
+#[test]
+fn test_is_deterministic() {
+ let (manager, temp_dir) = setup().expect("Failed to set up test environment");
+
+ let wallet_path = temp_dir.path().join("wallet_name");
+ let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");
+
+ let wallet = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet).expect("Failed to create wallet");
+ let result = wallet.is_deterministic();
+ assert!(result.is_ok(), "Failed to check if wallet is deterministic: {:?}", result.err());
+ assert!(result.unwrap(), "Wallet should be deterministic");
+
+ teardown(&temp_dir).expect("Failed to clean up after test");
+}
+
+#[test]
+fn test_wallet_creation_with_different_networks() {
+ let (manager, temp_dir) = setup().expect("Failed to set up test environment");
+
+ let wallets = vec![
+ ("mainnet_wallet", NetworkType::Mainnet),
+ ("testnet_wallet", NetworkType::Testnet),
+ ("stagenet_wallet", NetworkType::Stagenet),
+ ];
+
+ for (name, net_type) in wallets {
+ let wallet_path = temp_dir.path().join(name);
+ let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");
+
+ let wallet = manager.create_wallet(wallet_str, "password", "English", net_type);
+ assert!(wallet.is_ok(), "Failed to create wallet: {}", name);
+ }
+
+ teardown(&temp_dir).expect("Failed to clean up after test");
+}
+
+#[test]
+fn test_multiple_address_generation() {
+ let (manager, temp_dir) = setup().expect("Failed to set up test environment");
+
+ let wallet_path = temp_dir.path().join("wallet_name");
+ let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");
+
+ let wallet = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet).expect("Failed to create wallet");
+
+ for i in 0..5 {
+ let result = wallet.get_address(0, i);
+ assert!(result.is_ok(), "Failed to get address {}: {:?}", i, result.err());
+ assert!(!result.unwrap().is_empty(), "Address {} is empty", i);
+ }
+
+ teardown(&temp_dir).expect("Failed to clean up after test");
+}
+
+#[test]
+fn test_wallet_error_display() {
+ // Test WalletError::FfiError variant.
+ let error = WalletError::FfiError("Test error".to_string());
+ match error {
+ WalletError::FfiError(msg) => assert_eq!(msg, "Test error"),
+ _ => panic!("Expected FfiError variant"),
+ }
+
+ // Test WalletError::NullPointer variant.
+ let error = WalletError::NullPointer;
+ match error {
+ WalletError::NullPointer => assert!(true),
+ _ => panic!("Expected NullPointer variant"),
+ }
+
+ // Test WalletError::WalletErrorCode variant.
+ let error = WalletError::WalletErrorCode(2, "Sample wallet error".to_string());
+ match error {
+ WalletError::WalletErrorCode(code, msg) => {
+ assert_eq!(code, 2);
+ assert_eq!(msg, "Sample wallet error");
+ },
+ _ => panic!("Expected WalletErrorCode variant"),
+ }
+}