diff options
Diffstat (limited to 'impls/monero.rs/src')
| -rw-r--r-- | impls/monero.rs/src/bindings.rs | 1621 | ||||
| -rw-r--r-- | impls/monero.rs/src/lib.rs | 450 |
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"), + } +} |
