diff options
| -rw-r--r-- | contrib/depends/Makefile | 2 | ||||
| -rw-r--r-- | impls/monero.dart/lib/monero.dart | 14 | ||||
| -rw-r--r-- | impls/monero.dart/lib/src/generated_bindings_monero.g.dart | 36 | ||||
| -rw-r--r-- | impls/monero.dart/lib/src/monero.dart | 1032 | ||||
| -rw-r--r-- | impls/monero.dart/lib/src/wallet2.dart | 248 | ||||
| -rw-r--r-- | monero_libwallet2_api_c/src/main/cpp/monero_wallet2_api_c.cpp | 16 | ||||
| -rw-r--r-- | monero_libwallet2_api_c/src/main/cpp/monero_wallet2_api_c.h | 2 | ||||
| -rw-r--r-- | patches/monero/0021-trezor-import-export-sign-functions.patch | 245 |
8 files changed, 1033 insertions, 562 deletions
diff --git a/contrib/depends/Makefile b/contrib/depends/Makefile index 1a7ad47..34dc333 100644 --- a/contrib/depends/Makefile +++ b/contrib/depends/Makefile @@ -4,7 +4,7 @@ HOST ?= BOOST_VERSION ?= 1_90_0 PACKAGES = native/protobuf,native/cmake,native/python@3.14,native/git,native/_,native/make,native/cmake-toolchain,icu4c,boost@$(BOOST_VERSION),zeromq,unbound,sodium,openssl,libiconv,zlib,protobuf -SIMPLYBS_HASH = 8621f898aada59d15095a63e6b6746c69c2c5b76 +SIMPLYBS_HASH = 2091e0883265ad13cc9506ec1e7c0fb3c09ca646 all: simplybs $(if $(HOST),sbs-build-$(HOST),) @if [ -z "$(HOST)" ]; then \ diff --git a/impls/monero.dart/lib/monero.dart b/impls/monero.dart/lib/monero.dart index 9057f18..ef1da28 100644 --- a/impls/monero.dart/lib/monero.dart +++ b/impls/monero.dart/lib/monero.dart @@ -570,21 +570,21 @@ String UnsignedTransaction_signUR( } @Deprecated("TODO") -String UnsignedTransaction_commitTrezor( +String PendingTransaction_commitTrezor( PendingTransaction ptr, int tx_index) { - debugStart?.call('MONERO_UnsignedTransaction_commitTrezor'); + debugStart?.call('MONERO_PendingTransaction_commitTrezor'); lib ??= MoneroC(DynamicLibrary.open(libPath)); - final txid = lib!.MONERO_UnsignedTransaction_commitTrezor(ptr, tx_index); - debugEnd?.call('MONERO_UnsignedTransaction_commitTrezor'); + final txid = lib!.MONERO_PendingTransaction_commitTrezor(ptr, tx_index); + debugEnd?.call('MONERO_PendingTransaction_commitTrezor'); try { final strPtr = txid.cast<Utf8>(); final str = strPtr.toDartString(); MONERO_free(strPtr.cast()); - debugEnd?.call('MONERO_UnsignedTransaction_commitTrezor'); + debugEnd?.call('MONERO_PendingTransaction_commitTrezor'); return str; } catch (e) { - errorHandler?.call('MONERO_UnsignedTransaction_commitTrezor', e); - debugEnd?.call('MONERO_UnsignedTransaction_commitTrezor'); + errorHandler?.call('MONERO_PendingTransaction_commitTrezor', e); + debugEnd?.call('MONERO_PendingTransaction_commitTrezor'); return ""; } } diff --git a/impls/monero.dart/lib/src/generated_bindings_monero.g.dart b/impls/monero.dart/lib/src/generated_bindings_monero.g.dart index adf04da..36736d3 100644 --- a/impls/monero.dart/lib/src/generated_bindings_monero.g.dart +++ b/impls/monero.dart/lib/src/generated_bindings_monero.g.dart @@ -88,6 +88,24 @@ class MoneroC { _MONERO_PendingTransaction_commitURPtr.asFunction< ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Void>, int)>(); + ffi.Pointer<ffi.Char> MONERO_PendingTransaction_commitTrezor( + ffi.Pointer<ffi.Void> pendingTx_ptr, + int tx_index, + ) { + return _MONERO_PendingTransaction_commitTrezor( + pendingTx_ptr, + tx_index, + ); + } + + late final _MONERO_PendingTransaction_commitTrezorPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Void>, + ffi.Int)>>('MONERO_PendingTransaction_commitTrezor'); + late final _MONERO_PendingTransaction_commitTrezor = + _MONERO_PendingTransaction_commitTrezorPtr.asFunction< + ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Void>, int)>(); + int MONERO_PendingTransaction_amount( ffi.Pointer<ffi.Void> pendingTx_ptr, ) { @@ -484,24 +502,6 @@ class MoneroC { _MONERO_UnsignedTransaction_signURPtr.asFunction< ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Void>, int)>(); - ffi.Pointer<ffi.Char> MONERO_UnsignedTransaction_commitTrezor( - ffi.Pointer<ffi.Void> unsignedTx_ptr, - int tx_index, - ) { - return _MONERO_UnsignedTransaction_commitTrezor( - unsignedTx_ptr, - tx_index, - ); - } - - late final _MONERO_UnsignedTransaction_commitTrezorPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Void>, - ffi.Int)>>('MONERO_UnsignedTransaction_commitTrezor'); - late final _MONERO_UnsignedTransaction_commitTrezor = - _MONERO_UnsignedTransaction_commitTrezorPtr.asFunction< - ffi.Pointer<ffi.Char> Function(ffi.Pointer<ffi.Void>, int)>(); - int MONERO_TransactionInfo_direction( ffi.Pointer<ffi.Void> txInfo_ptr, ) { diff --git a/impls/monero.dart/lib/src/monero.dart b/impls/monero.dart/lib/src/monero.dart index 717d59f..d227bef 100644 --- a/impls/monero.dart/lib/src/monero.dart +++ b/impls/monero.dart/lib/src/monero.dart @@ -11,7 +11,7 @@ class Monero implements Wallet2 { Wallet2WalletManagerFactory walletManagerFactory() { return MoneroWalletManagerFactory(); } - + @override int ffiAddress() => 0; } @@ -20,48 +20,54 @@ class MoneroAddressBook implements Wallet2AddressBook { MoneroAddressBook(this.addressBookPtr); final monero.AddressBook addressBookPtr; - + @override - bool addRow({required String dstAddr, required String paymentId, required String description}) { - return monero.AddressBook_addRow(addressBookPtr, dstAddr: dstAddr, paymentId: paymentId, description: description); + bool addRow( + {required String dstAddr, + required String paymentId, + required String description}) { + return monero.AddressBook_addRow(addressBookPtr, + dstAddr: dstAddr, paymentId: paymentId, description: description); } - + @override bool deleteRow({required int rowId}) { return monero.AddressBook_deleteRow(addressBookPtr, rowId: rowId); } - + @override int errorCode() { return monero.AddressBook_errorCode(addressBookPtr); } - + @override Wallet2AddressBookRow getAll_byIndex(int index) { final row = monero.AddressBook_getAll_byIndex(addressBookPtr, index: index); return MoneroAddressBookRow(row); } - + @override int getAll_size() { return monero.AddressBook_getAll_size(addressBookPtr); } - + @override int lookupPaymentID({required String paymentId}) { - return monero.AddressBook_lookupPaymentID(addressBookPtr, paymentId: paymentId); + return monero.AddressBook_lookupPaymentID(addressBookPtr, + paymentId: paymentId); } - + @override void refresh() { monero.AddressBook_refresh(addressBookPtr); } - + @override bool setDescription({required int rowId, required String description}) { - return monero.AddressBook_setDescription(addressBookPtr, rowId: rowId, description: description); + return monero.AddressBook_setDescription(addressBookPtr, + rowId: rowId, description: description); } - + @override int ffiAddress() => addressBookPtr.address; } @@ -70,27 +76,27 @@ class MoneroAddressBookRow implements Wallet2AddressBookRow { MoneroAddressBookRow(this.addressBookRowPtr); final monero.AddressBookRow addressBookRowPtr; - + @override String extra() { return monero.AddressBookRow_extra(addressBookRowPtr); } - + @override String getAddress() { return monero.AddressBookRow_getAddress(addressBookRowPtr); } - + @override String getDescription() { return monero.AddressBookRow_getDescription(addressBookRowPtr); } - + @override String getPaymentId() { return monero.AddressBookRow_getPaymentId(addressBookRowPtr); } - + @override int getRowId() { return monero.AddressBookRow_getRowId(addressBookRowPtr); @@ -104,54 +110,55 @@ class MoneroCoins implements Wallet2Coins { MoneroCoins(this.coinsPtr); final monero.Coins coinsPtr; - + @override Wallet2CoinsInfo coin(int index) { final coin = monero.Coins_coin(coinsPtr, index); return MoneroCoinsInfo(coin); } - + @override int count() { return monero.Coins_count(coinsPtr); } - + @override Wallet2CoinsInfo getAll_byIndex(int index) { final coin = monero.Coins_getAll_byIndex(coinsPtr, index); return MoneroCoinsInfo(coin); } - + @override int getAll_size() { return monero.Coins_getAll_size(coinsPtr); } - + @override bool isTransferUnlocked({required int unlockTime, required int blockHeight}) { - return monero.Coins_isTransferUnlocked(coinsPtr, unlockTime: unlockTime, blockHeight: blockHeight); + return monero.Coins_isTransferUnlocked(coinsPtr, + unlockTime: unlockTime, blockHeight: blockHeight); } - + @override void refresh() { monero.Coins_refresh(coinsPtr); } - + @override void setFrozen({required int index}) { monero.Coins_setFrozen(coinsPtr, index: index); } - + @override void setFrozenByPublicKey({required String publicKey}) { monero.Coins_setFrozenByPublicKey(coinsPtr, publicKey: publicKey); } - + @override void thaw({required int index}) { monero.Coins_thaw(coinsPtr, index: index); } - + @override void thawByPublicKey({required String publicKey}) { monero.Coins_thawByPublicKey(coinsPtr, publicKey: publicKey); @@ -165,107 +172,107 @@ class MoneroCoinsInfo implements Wallet2CoinsInfo { MoneroCoinsInfo(this.coinsInfoPtr); final monero.CoinsInfo coinsInfoPtr; - + @override String address() { return monero.CoinsInfo_address(coinsInfoPtr); } - + @override String addressLabel() { return monero.CoinsInfo_addressLabel(coinsInfoPtr); } - + @override int amount() { return monero.CoinsInfo_amount(coinsInfoPtr); } - + @override int blockHeight() { return monero.CoinsInfo_blockHeight(coinsInfoPtr); } - + @override bool coinbase() { return monero.CoinsInfo_coinbase(coinsInfoPtr); } - + @override String description() { return monero.CoinsInfo_description(coinsInfoPtr); } - + @override bool frozen() { return monero.CoinsInfo_frozen(coinsInfoPtr); } - + @override int globalOutputIndex() { return monero.CoinsInfo_globalOutputIndex(coinsInfoPtr); } - + @override String hash() { return monero.CoinsInfo_hash(coinsInfoPtr); } - + @override int internalOutputIndex() { return monero.CoinsInfo_internalOutputIndex(coinsInfoPtr); } - + @override String keyImage() { return monero.CoinsInfo_keyImage(coinsInfoPtr); } - + @override bool keyImageKnown() { return monero.CoinsInfo_keyImageKnown(coinsInfoPtr); } - + @override int pkIndex() { return monero.CoinsInfo_pkIndex(coinsInfoPtr); } - + @override String pubKey() { return monero.CoinsInfo_pubKey(coinsInfoPtr); } - + @override bool rct() { return monero.CoinsInfo_rct(coinsInfoPtr); } - + @override bool spent() { return monero.CoinsInfo_spent(coinsInfoPtr); } - + @override int spentHeight() { return monero.CoinsInfo_spentHeight(coinsInfoPtr); } - + @override int subaddrAccount() { return monero.CoinsInfo_subaddrAccount(coinsInfoPtr); } - + @override int subaddrIndex() { return monero.CoinsInfo_subaddrIndex(coinsInfoPtr); } - + @override int unlockTime() { return monero.CoinsInfo_unlockTime(coinsInfoPtr); } - + @override bool unlocked() { return monero.CoinsInfo_unlocked(coinsInfoPtr); @@ -279,12 +286,12 @@ class MoneroDeviceProgress implements Wallet2DeviceProgress { MoneroDeviceProgress(this.deviceProgressPtr); final monero.DeviceProgress deviceProgressPtr; - + @override bool indeterminate() { return monero.DeviceProgress_indeterminate(deviceProgressPtr); } - + @override bool progress() { return monero.DeviceProgress_progress(deviceProgressPtr); @@ -298,27 +305,29 @@ class MoneroWalletListener implements Wallet2WalletListener { MoneroWalletListener(this.walletListenerPtr); final monero.WalletListener walletListenerPtr; - + @override int height() { return monero.MONERO_cw_WalletListener_height(walletListenerPtr); } - + @override bool isNeedToRefresh() { return monero.MONERO_cw_WalletListener_isNeedToRefresh(walletListenerPtr); } - + @override bool isNewTransactionExist() { - return monero.MONERO_cw_WalletListener_isNewTransactionExist(walletListenerPtr); + return monero.MONERO_cw_WalletListener_isNewTransactionExist( + walletListenerPtr); } - + @override void resetIsNewTransactionExist() { - monero.MONERO_cw_WalletListener_resetIsNewTransactionExist(walletListenerPtr); + monero.MONERO_cw_WalletListener_resetIsNewTransactionExist( + walletListenerPtr); } - + @override void resetNeedToRefresh() { monero.MONERO_cw_WalletListener_resetNeedToRefresh(walletListenerPtr); @@ -335,12 +344,12 @@ class MoneroWalletChecksum implements Wallet2Checksum { String checksum_wallet2_api_c_cpp() { return monero.MONERO_checksum_wallet2_api_c_cpp(); } - + @override String checksum_wallet2_api_c_exp() { return monero.MONERO_checksum_wallet2_api_c_exp(); } - + @override String checksum_wallet2_api_c_h() { return monero.MONERO_checksum_wallet2_api_c_h(); @@ -366,22 +375,22 @@ class MoneroMultisigState implements Wallet2MultisigState { MoneroMultisigState(this.multisigStatePtr); final monero.MultisigState multisigStatePtr; - + @override bool isMultisig(Pointer<Void> ptr) { return monero.MultisigState_isMultisig(multisigStatePtr); } - + @override bool isReady(Pointer<Void> ptr) { return monero.MultisigState_isReady(multisigStatePtr); } - + @override int threshold(Pointer<Void> ptr) { return monero.MultisigState_threshold(multisigStatePtr); } - + @override int total(Pointer<Void> ptr) { return monero.MultisigState_total(multisigStatePtr); @@ -395,77 +404,82 @@ class MoneroPendingTransaction implements Wallet2PendingTransaction { MoneroPendingTransaction(this.pendingTransactionPtr); final monero.PendingTransaction pendingTransactionPtr; - + @override int amount() { return monero.PendingTransaction_amount(pendingTransactionPtr); } - + @override bool commit({required String filename, required bool overwrite}) { - return monero.PendingTransaction_commit(pendingTransactionPtr, filename: filename, overwrite: overwrite); + return monero.PendingTransaction_commit(pendingTransactionPtr, + filename: filename, overwrite: overwrite); } - + @override String commitUR(int max_fragment_length) { - return monero.PendingTransaction_commitUR(pendingTransactionPtr, max_fragment_length); + return monero.PendingTransaction_commitUR( + pendingTransactionPtr, max_fragment_length); } - + @override int dust() { return monero.PendingTransaction_dust(pendingTransactionPtr); } - + @override String errorString() { return monero.PendingTransaction_errorString(pendingTransactionPtr); } - + @override int fee() { return monero.PendingTransaction_fee(pendingTransactionPtr); } - + @override String hex(String separator) { return monero.PendingTransaction_hex(pendingTransactionPtr, separator); } - + @override String multisigSignData() { return monero.PendingTransaction_multisigSignData(pendingTransactionPtr); } - + @override void signMultisigTx() { monero.PendingTransaction_signMultisigTx(pendingTransactionPtr); } - + @override String signersKeys(String separator) { - return monero.PendingTransaction_signersKeys(pendingTransactionPtr, separator); + return monero.PendingTransaction_signersKeys( + pendingTransactionPtr, separator); } - + @override int status() { return monero.PendingTransaction_status(pendingTransactionPtr); } - + @override String subaddrAccount(String separator) { - return monero.PendingTransaction_subaddrAccount(pendingTransactionPtr, separator); + return monero.PendingTransaction_subaddrAccount( + pendingTransactionPtr, separator); } - + @override String subaddrIndices(String separator) { - return monero.PendingTransaction_subaddrIndices(pendingTransactionPtr, separator); + return monero.PendingTransaction_subaddrIndices( + pendingTransactionPtr, separator); } - + @override int txCount() { return monero.PendingTransaction_txCount(pendingTransactionPtr); } - + @override String txid(String separator) { return monero.PendingTransaction_txid(pendingTransactionPtr, separator); @@ -479,31 +493,37 @@ class MoneroSubaddress implements Wallet2Subaddress { MoneroSubaddress(this.subaddressPtr); final monero.Subaddress subaddressPtr; - + @override void addRow({required int accountIndex, required String label}) { - monero.Subaddress_addRow(subaddressPtr, accountIndex: accountIndex, label: label); + monero.Subaddress_addRow(subaddressPtr, + accountIndex: accountIndex, label: label); } - + @override Wallet2SubaddressRow getAll_byIndex(int index) { final row = monero.Subaddress_getAll_byIndex(subaddressPtr, index: index); return MoneroSubaddressRow(row); } - + @override int getAll_size() { return monero.Subaddress_getAll_size(subaddressPtr); } - + @override void refresh({required int accountIndex, required String label}) { - monero.Subaddress_refresh(subaddressPtr, accountIndex: accountIndex, label: label); + monero.Subaddress_refresh(subaddressPtr, + accountIndex: accountIndex, label: label); } - + @override - void setLabel({required int accountIndex, required int addressIndex, required String label}) { - monero.Subaddress_setLabel(subaddressPtr, accountIndex: accountIndex, addressIndex: addressIndex, label: label); + void setLabel( + {required int accountIndex, + required int addressIndex, + required String label}) { + monero.Subaddress_setLabel(subaddressPtr, + accountIndex: accountIndex, addressIndex: addressIndex, label: label); } @override @@ -514,31 +534,33 @@ class MoneroSubaddressAccount implements Wallet2SubaddressAccount { MoneroSubaddressAccount(this.subaddressAccountPtr); final monero.SubaddressAccount subaddressAccountPtr; - + @override void addRow({required String label}) { monero.SubaddressAccount_addRow(subaddressAccountPtr, label: label); } - + @override Wallet2SubaddressAccountRow getAll_byIndex(int index) { - final row = monero.SubaddressAccount_getAll_byIndex(subaddressAccountPtr, index: index); + final row = monero.SubaddressAccount_getAll_byIndex(subaddressAccountPtr, + index: index); return MoneroSubaddressAccountRow(row); } - + @override int getAll_size() { return monero.SubaddressAccount_getAll_size(subaddressAccountPtr); } - + @override void refresh() { monero.SubaddressAccount_refresh(subaddressAccountPtr); } - + @override void setLabel({required int accountIndex, required String label}) { - monero.SubaddressAccount_setLabel(subaddressAccountPtr, accountIndex: accountIndex, label: label); + monero.SubaddressAccount_setLabel(subaddressAccountPtr, + accountIndex: accountIndex, label: label); } @override @@ -549,35 +571,36 @@ class MoneroSubaddressAccountRow implements Wallet2SubaddressAccountRow { MoneroSubaddressAccountRow(this.subaddressAccountRowPtr); final monero.SubaddressAccountRow subaddressAccountRowPtr; - + @override String extra() { return monero.SubaddressAccountRow_extra(subaddressAccountRowPtr); } - + @override String getAddress() { return monero.SubaddressAccountRow_getAddress(subaddressAccountRowPtr); } - + @override String getBalance() { return monero.SubaddressAccountRow_getBalance(subaddressAccountRowPtr); } - + @override String getLabel() { return monero.SubaddressAccountRow_getLabel(subaddressAccountRowPtr); } - + @override int getRowId() { return monero.SubaddressAccountRow_getRowId(subaddressAccountRowPtr); } - + @override String getUnlockedBalance() { - return monero.SubaddressAccountRow_getUnlockedBalance(subaddressAccountRowPtr); + return monero.SubaddressAccountRow_getUnlockedBalance( + subaddressAccountRowPtr); } @override @@ -588,22 +611,22 @@ class MoneroSubaddressRow implements Wallet2SubaddressRow { MoneroSubaddressRow(this.subaddressRowPtr); final monero.SubaddressRow subaddressRowPtr; - + @override String extra() { return monero.SubaddressRow_extra(subaddressRowPtr); } - + @override String getAddress() { return monero.SubaddressRow_getAddress(subaddressRowPtr); } - + @override String getLabel() { return monero.SubaddressRow_getLabel(subaddressRowPtr); } - + @override int getRowId() { return monero.SubaddressRow_getRowId(subaddressRowPtr); @@ -617,31 +640,34 @@ class MoneroTransactionHistory implements Wallet2TransactionHistory { MoneroTransactionHistory(this.transactionHistoryPtr); final monero.TransactionHistory transactionHistoryPtr; - + @override int count() { return monero.TransactionHistory_count(transactionHistoryPtr); } - + @override void refresh() { monero.TransactionHistory_refresh(transactionHistoryPtr); } - + @override void setTxNote({required String txid, required String note}) { - monero.TransactionHistory_setTxNote(transactionHistoryPtr, txid: txid, note: note); + monero.TransactionHistory_setTxNote(transactionHistoryPtr, + txid: txid, note: note); } - + @override Wallet2TransactionInfo transaction(int index) { - final tx = monero.TransactionHistory_transaction(transactionHistoryPtr, index: index); + final tx = monero.TransactionHistory_transaction(transactionHistoryPtr, + index: index); return MoneroTransactionInfo(tx); } - + @override Wallet2TransactionInfo transactionById(String txid) { - final tx = monero.TransactionHistory_transactionById(transactionHistoryPtr, txid: txid); + final tx = monero.TransactionHistory_transactionById(transactionHistoryPtr, + txid: txid); return MoneroTransactionInfo(tx); } @@ -653,102 +679,102 @@ class MoneroTransactionInfo implements Wallet2TransactionInfo { MoneroTransactionInfo(this.transactionInfoPtr); final monero.TransactionInfo transactionInfoPtr; - + @override int amount() { return monero.TransactionInfo_amount(transactionInfoPtr); } - + @override int blockHeight() { return monero.TransactionInfo_blockHeight(transactionInfoPtr); } - + @override int confirmations() { return monero.TransactionInfo_confirmations(transactionInfoPtr); } - + @override String description() { return monero.TransactionInfo_description(transactionInfoPtr); } - + @override int direction() { return monero.TransactionInfo_direction(transactionInfoPtr).index; } - + @override int fee() { return monero.TransactionInfo_fee(transactionInfoPtr); } - + @override String hash() { return monero.TransactionInfo_hash(transactionInfoPtr); } - + @override bool isCoinbase() { return monero.TransactionInfo_isCoinbase(transactionInfoPtr); } - + @override bool isFailed() { return monero.TransactionInfo_isFailed(transactionInfoPtr); } - + @override bool isPending() { return monero.TransactionInfo_isPending(transactionInfoPtr); } - + @override String label() { return monero.TransactionInfo_label(transactionInfoPtr); } - + @override String paymentId() { return monero.TransactionInfo_paymentId(transactionInfoPtr); } - + @override int subaddrAccount() { return monero.TransactionInfo_subaddrAccount(transactionInfoPtr); } - + @override String subaddrIndex() { return monero.TransactionInfo_subaddrIndex(transactionInfoPtr); } - + @override int timestamp() { return monero.TransactionInfo_timestamp(transactionInfoPtr); } - + @override String transfers_address(int index) { return monero.TransactionInfo_transfers_address(transactionInfoPtr, index); } - + @override int transfers_amount(int index) { return monero.TransactionInfo_transfers_amount(transactionInfoPtr, index); } - + @override int transfers_count() { return monero.TransactionInfo_transfers_count(transactionInfoPtr); } - + @override int unlockTime() { return monero.TransactionInfo_unlockTime(transactionInfoPtr); } - + @override int ffiAddress() => transactionInfoPtr.address; } @@ -757,72 +783,70 @@ class MoneroUnsignedTransaction implements Wallet2UnsignedTransaction { MoneroUnsignedTransaction(this.unsignedTransactionPtr); final monero.UnsignedTransaction unsignedTransactionPtr; - + @override String amount() { return monero.UnsignedTransaction_amount(unsignedTransactionPtr); } - + @override String confirmationMessage() { - return monero.UnsignedTransaction_confirmationMessage(unsignedTransactionPtr); + return monero.UnsignedTransaction_confirmationMessage( + unsignedTransactionPtr); } - + @override String errorString() { return monero.UnsignedTransaction_errorString(unsignedTransactionPtr); } - + @override String fee() { return monero.UnsignedTransaction_fee(unsignedTransactionPtr); } - + @override int minMixinCount() { return monero.UnsignedTransaction_minMixinCount(unsignedTransactionPtr); } - + @override String mixin() { return monero.UnsignedTransaction_mixin(unsignedTransactionPtr); } - + @override String paymentId() { return monero.UnsignedTransaction_paymentId(unsignedTransactionPtr); } - + @override String recipientAddress() { return monero.UnsignedTransaction_recipientAddress(unsignedTransactionPtr); } - + @override bool sign(String signedFileName) { - return monero.UnsignedTransaction_sign(unsignedTransactionPtr, signedFileName); + return monero.UnsignedTransaction_sign( + unsignedTransactionPtr, signedFileName); } - + @override String signUR(int max_fragment_length) { - return monero.UnsignedTransaction_signUR(unsignedTransactionPtr, max_fragment_length); + return monero.UnsignedTransaction_signUR( + unsignedTransactionPtr, max_fragment_length); } @override - String commitTrezor(int tx_index) { - return monero.UnsignedTransaction_commitTrezor(unsignedTransactionPtr, tx_index); - } - - @override int status() { return monero.UnsignedTransaction_status(unsignedTransactionPtr); } - + @override int txCount() { return monero.UnsignedTransaction_txCount(unsignedTransactionPtr); } - + @override int ffiAddress() => unsignedTransactionPtr.address; } @@ -831,227 +855,273 @@ class MoneroWallet implements Wallet2Wallet { MoneroWallet(this.walletPtr); final monero.wallet walletPtr; - + @override void addSubaddress({required int accountIndex, String label = ""}) { - monero.Wallet_addSubaddress(walletPtr, accountIndex: accountIndex, label: label); + monero.Wallet_addSubaddress(walletPtr, + accountIndex: accountIndex, label: label); } - + @override void addSubaddressAccount({String label = ""}) { monero.Wallet_addSubaddressAccount(walletPtr, label: label); } - + @override String address({int accountIndex = 0, int addressIndex = 0}) { - return monero.Wallet_address(walletPtr, accountIndex: accountIndex, addressIndex: addressIndex); + return monero.Wallet_address(walletPtr, + accountIndex: accountIndex, addressIndex: addressIndex); } - + @override Wallet2AddressBook addressBook() { return MoneroAddressBook(monero.Wallet_addressBook(walletPtr)); } - + @override bool addressValid(String address, int networkType) { return monero.Wallet_addressValid(address, networkType); } - + @override int amountFromDouble(double amount) { return monero.Wallet_amountFromDouble(amount); } - + @override int amountFromString(String amount) { return monero.Wallet_amountFromString(amount); } - + @override int approximateBlockChainHeight() { return monero.Wallet_approximateBlockChainHeight(walletPtr); } - + @override int autoRefreshInterval() { return monero.Wallet_autoRefreshInterval(walletPtr); } - + @override int balance({required int accountIndex}) { return monero.Wallet_balance(walletPtr, accountIndex: accountIndex); } - + @override int blockChainHeight() { return monero.Wallet_blockChainHeight(walletPtr); } - + @override Wallet2Coins coins() { return MoneroCoins(monero.Wallet_coins(walletPtr)); } - + @override int coldKeyImageSync({required int spent, required int unspent}) { - return monero.Wallet_coldKeyImageSync(walletPtr, spent: spent, unspent: unspent); + return monero.Wallet_coldKeyImageSync(walletPtr, + spent: spent, unspent: unspent); } - + @override bool connectToDaemon() { return monero.Wallet_connectToDaemon(walletPtr); } - + @override int connected() { return monero.Wallet_connected(walletPtr); } - + @override String createPolyseed({String language = "English"}) { return monero.Wallet_createPolyseed(language: language); } - + @override - Wallet2PendingTransaction createTransaction({required String dst_addr, required String payment_id, required int amount, required int mixin_count, required int pendingTransactionPriority, required int subaddr_account, List<String> preferredInputs = const []}) { - final transaction = monero.Wallet_createTransaction(walletPtr, dst_addr: dst_addr, payment_id: payment_id, amount: amount, mixin_count: mixin_count, pendingTransactionPriority: pendingTransactionPriority, subaddr_account: subaddr_account, preferredInputs: preferredInputs); + Wallet2PendingTransaction createTransaction( + {required String dst_addr, + required String payment_id, + required int amount, + required int mixin_count, + required int pendingTransactionPriority, + required int subaddr_account, + List<String> preferredInputs = const []}) { + final transaction = monero.Wallet_createTransaction(walletPtr, + dst_addr: dst_addr, + payment_id: payment_id, + amount: amount, + mixin_count: mixin_count, + pendingTransactionPriority: pendingTransactionPriority, + subaddr_account: subaddr_account, + preferredInputs: preferredInputs); return MoneroPendingTransaction(transaction); } - + @override - Wallet2PendingTransaction createTransactionMultDest({required List<String> dstAddr, String paymentId = "", required bool isSweepAll, required List<int> amounts, required int mixinCount, required int pendingTransactionPriority, required int subaddr_account, List<String> preferredInputs = const []}) { - final transaction = monero.Wallet_createTransactionMultDest(walletPtr, dstAddr: dstAddr, paymentId: paymentId, isSweepAll: isSweepAll, amounts: amounts, mixinCount: mixinCount, pendingTransactionPriority: pendingTransactionPriority, subaddr_account: subaddr_account, preferredInputs: preferredInputs); + Wallet2PendingTransaction createTransactionMultDest( + {required List<String> dstAddr, + String paymentId = "", + required bool isSweepAll, + required List<int> amounts, + required int mixinCount, + required int pendingTransactionPriority, + required int subaddr_account, + List<String> preferredInputs = const []}) { + final transaction = monero.Wallet_createTransactionMultDest(walletPtr, + dstAddr: dstAddr, + paymentId: paymentId, + isSweepAll: isSweepAll, + amounts: amounts, + mixinCount: mixinCount, + pendingTransactionPriority: pendingTransactionPriority, + subaddr_account: subaddr_account, + preferredInputs: preferredInputs); return MoneroPendingTransaction(transaction); } - + @override - bool createWatchOnly({required String path, required String password, required String language}) { - return monero.Wallet_createWatchOnly(walletPtr, path: path, password: password, language: language); + bool createWatchOnly( + {required String path, + required String password, + required String language}) { + return monero.Wallet_createWatchOnly(walletPtr, + path: path, password: password, language: language); } - + @override int daemonBlockChainHeight() { return monero.Wallet_daemonBlockChainHeight(walletPtr); } - + @override int defaultMixin() { return monero.Wallet_defaultMixin(walletPtr); } - + @override - String deviceShowAddress({required int accountIndex, required int addressIndex}) { - return monero.Wallet_deviceShowAddress(walletPtr, accountIndex: accountIndex, addressIndex: addressIndex); + String deviceShowAddress( + {required int accountIndex, required int addressIndex}) { + return monero.Wallet_deviceShowAddress(walletPtr, + accountIndex: accountIndex, addressIndex: addressIndex); } - + @override String displayAmount(int amount) { return monero.Wallet_displayAmount(amount); } - + @override String errorString() { return monero.Wallet_errorString(walletPtr); } - + @override int estimateBlockChainHeight() { return monero.Wallet_estimateBlockChainHeight(walletPtr); } - + @override - String exchangeMultisigKeys({required List<String> info, required bool force_update_use_with_caution}) { - return monero.Wallet_exchangeMultisigKeys(walletPtr, info: info, force_update_use_with_caution: force_update_use_with_caution); + String exchangeMultisigKeys( + {required List<String> info, + required bool force_update_use_with_caution}) { + return monero.Wallet_exchangeMultisigKeys(walletPtr, + info: info, + force_update_use_with_caution: force_update_use_with_caution); } - + @override bool exportKeyImages(String filename, {required bool all}) { return monero.Wallet_exportKeyImages(walletPtr, filename, all: all); } - + @override String exportKeyImagesUR({int max_fragment_length = 130, bool all = false}) { - return monero.Wallet_exportKeyImagesUR(walletPtr, max_fragment_length: max_fragment_length, all: all); + return monero.Wallet_exportKeyImagesUR(walletPtr, + max_fragment_length: max_fragment_length, all: all); } - + @override List<String> exportMultisigImages({required List<String> info}) { - return monero.Wallet_exportMultisigImages(walletPtr, info: info, force_update_use_with_caution: false); + return monero.Wallet_exportMultisigImages(walletPtr, + info: info, force_update_use_with_caution: false); } - + @override bool exportOutputs(String filename, {required bool all}) { return monero.Wallet_exportOutputs(walletPtr, filename, all: all); } - + @override String exportOutputsUR({int max_fragment_length = 130, bool all = false}) { - return monero.Wallet_exportOutputsUR(walletPtr, max_fragment_length: max_fragment_length, all: all); + return monero.Wallet_exportOutputsUR(walletPtr, + max_fragment_length: max_fragment_length, all: all); } - + @override String filename() { return monero.Wallet_filename(walletPtr); } - + @override String genPaymentId() { return monero.Wallet_genPaymentId(); } - + @override int getBackgroundSyncType() { return monero.Wallet_getBackgroundSyncType(walletPtr); } - + @override int getBytesReceived() { return monero.Wallet_getBytesReceived(walletPtr); } - + @override int getBytesSent() { throw UnimplementedError(); } - + @override String getCacheAttribute({required String key}) { return monero.Wallet_getCacheAttribute(walletPtr, key: key); } - + @override int getDeviceType() { return monero.Wallet_getDeviceType(walletPtr); } - + @override String getMultisigInfo() { return monero.Wallet_getMultisigInfo(walletPtr); } - + @override String getPassword() { return monero.Wallet_getPassword(walletPtr); } - + @override String getPolyseed({required String passphrase}) { return monero.Wallet_getPolyseed(walletPtr, passphrase: passphrase); } - + static Pointer<UnsignedChar> getReceivedFromDevice() { return monero.Wallet_getReceivedFromDevice(); } - + static int getReceivedFromDeviceLength() { return monero.Wallet_getReceivedFromDeviceLength(); } - + @override int getRefreshFromBlockHeight() { return monero.Wallet_getRefreshFromBlockHeight(walletPtr); } - + @override String getSeedLanguage() { return monero.Wallet_getSeedLanguage(walletPtr); @@ -1060,464 +1130,530 @@ class MoneroWallet implements Wallet2Wallet { static Pointer<UnsignedChar> getSendToDevice() { return monero.Wallet_getSendToDevice(); } - + static int getSendToDeviceLength() { return monero.Wallet_getSendToDeviceLength(); } - + static bool getStateIsConnected() { return monero.Wallet_getStateIsConnected(); } - + @override - String getSubaddressLabel({required int accountIndex, required int addressIndex}) { - return monero.Wallet_getSubaddressLabel(walletPtr, accountIndex: accountIndex, addressIndex: addressIndex); + String getSubaddressLabel( + {required int accountIndex, required int addressIndex}) { + return monero.Wallet_getSubaddressLabel(walletPtr, + accountIndex: accountIndex, addressIndex: addressIndex); } - + @override String getTxKey({required String txid}) { return monero.Wallet_getTxKey(walletPtr, txid: txid); } - + @override String getUserNote({required String txid}) { return monero.Wallet_getUserNote(walletPtr, txid: txid); } - + static bool getWaitsForDeviceReceive() { return monero.Wallet_getWaitsForDeviceReceive(); } - + static bool getWaitsForDeviceSend() { return monero.Wallet_getWaitsForDeviceSend(); } - + @override Wallet2WalletListener getWalletListener() { final listener = monero.MONERO_cw_getWalletListener(walletPtr); return MoneroWalletListener(listener); } - + @override int hasMultisigPartialKeyImages() { return monero.Wallet_hasMultisigPartialKeyImages(walletPtr); } - + @override bool hasUnknownKeyImages() { return monero.Wallet_hasUnknownKeyImages(walletPtr); } - + @override Wallet2TransactionHistory history() { return MoneroTransactionHistory(monero.Wallet_history(walletPtr)); } - + @override bool importKeyImages(String filename) { return monero.Wallet_importKeyImages(walletPtr, filename); } - + @override bool importKeyImagesUR(String input) { return monero.Wallet_importKeyImagesUR(walletPtr, input); } - + @override int importMultisigImages({required List<String> info}) { return monero.Wallet_importMultisigImages(walletPtr, info: info); } - + @override bool importOutputs(String filename) { return monero.Wallet_importOutputs(walletPtr, filename); } - + @override bool importOutputsUR(String input) { return monero.Wallet_importOutputsUR(walletPtr, input); } - + @override - bool init({required String daemonAddress, int upperTransacationSizeLimit = 0, String daemonUsername = "", String daemonPassword = "", bool useSsl = false, bool lightWallet = false, String proxyAddress = ""}) { - return monero.Wallet_init(walletPtr, daemonAddress: daemonAddress, upperTransacationSizeLimit: upperTransacationSizeLimit, daemonUsername: daemonUsername, daemonPassword: daemonPassword, useSsl: useSsl, lightWallet: lightWallet, proxyAddress: proxyAddress); + bool init( + {required String daemonAddress, + int upperTransacationSizeLimit = 0, + String daemonUsername = "", + String daemonPassword = "", + bool useSsl = false, + bool lightWallet = false, + String proxyAddress = ""}) { + return monero.Wallet_init(walletPtr, + daemonAddress: daemonAddress, + upperTransacationSizeLimit: upperTransacationSizeLimit, + daemonUsername: daemonUsername, + daemonPassword: daemonPassword, + useSsl: useSsl, + lightWallet: lightWallet, + proxyAddress: proxyAddress); } - + @override - void init3({required String argv0, required String defaultLogBaseName, required String logPath, required bool console}) { - return monero.Wallet_init3(walletPtr, argv0: argv0, defaultLogBaseName: defaultLogBaseName, logPath: logPath, console: console); + void init3( + {required String argv0, + required String defaultLogBaseName, + required String logPath, + required bool console}) { + return monero.Wallet_init3(walletPtr, + argv0: argv0, + defaultLogBaseName: defaultLogBaseName, + logPath: logPath, + console: console); } - + @override String integratedAddress({required String paymentId}) { return monero.Wallet_integratedAddress(walletPtr, paymentId: paymentId); } - + @override bool isBackgroundSyncing() { return monero.Wallet_isBackgroundSyncing(walletPtr); } - + @override bool isBackgroundWallet() { return monero.Wallet_isBackgroundWallet(walletPtr); } - + @override bool isKeysFileLocked() { return monero.Wallet_isKeysFileLocked(walletPtr); } - + @override bool isOffline() { return monero.Wallet_isOffline(walletPtr); } - + @override void keyReuseMitigation2({required bool mitigation}) { monero.Wallet_keyReuseMitigation2(walletPtr, mitigation: mitigation); } - + @override - bool keyValid({required String secret_key_string, required String address_string, required bool isViewKey, required int nettype}) { - return monero.Wallet_keyValid(secret_key_string: secret_key_string, address_string: address_string, isViewKey: isViewKey, nettype: nettype); + bool keyValid( + {required String secret_key_string, + required String address_string, + required bool isViewKey, + required int nettype}) { + return monero.Wallet_keyValid( + secret_key_string: secret_key_string, + address_string: address_string, + isViewKey: isViewKey, + nettype: nettype); } - + @override - String keyValid_error({required String secret_key_string, required String address_string, required bool isViewKey, required int nettype}) { - return monero.Wallet_keyValid_error(secret_key_string: secret_key_string, address_string: address_string, isViewKey: isViewKey, nettype: nettype); + String keyValid_error( + {required String secret_key_string, + required String address_string, + required bool isViewKey, + required int nettype}) { + return monero.Wallet_keyValid_error( + secret_key_string: secret_key_string, + address_string: address_string, + isViewKey: isViewKey, + nettype: nettype); } - + @override String keysFilename() { return monero.Wallet_keysFilename(walletPtr); } - + @override - Wallet2UnsignedTransaction loadUnsignedTx({required String unsigned_filename}) { - final tx = monero.Wallet_loadUnsignedTx(walletPtr, unsigned_filename: unsigned_filename); + Wallet2UnsignedTransaction loadUnsignedTx( + {required String unsigned_filename}) { + final tx = monero.Wallet_loadUnsignedTx(walletPtr, + unsigned_filename: unsigned_filename); return MoneroUnsignedTransaction(tx); } - + @override Wallet2UnsignedTransaction loadUnsignedTxUR({required String input}) { final tx = monero.Wallet_loadUnsignedTxUR(walletPtr, input: input); return MoneroUnsignedTransaction(tx); } - + @override bool lockKeysFile() { return monero.Wallet_lockKeysFile(walletPtr); } - + @override String makeMultisig({required List<String> info, required int threshold}) { - return monero.Wallet_makeMultisig(walletPtr, info: info, threshold: threshold); + return monero.Wallet_makeMultisig(walletPtr, + info: info, threshold: threshold); } - + @override int maximumAllowedAmount() { return monero.Wallet_maximumAllowedAmount(); } - + @override Wallet2MultisigState multisig() { return MoneroMultisigState(monero.Wallet_multisig(walletPtr)); } - + @override int nettype() { return monero.Wallet_nettype(walletPtr); } - + @override int numSubaddressAccounts() { return monero.Wallet_numSubaddressAccounts(walletPtr); } - + @override int numSubaddresses({required int accountIndex}) { return monero.Wallet_numSubaddresses(walletPtr, accountIndex: accountIndex); } - + @override String path() { return monero.Wallet_path(walletPtr); } - + @override void pauseRefresh() { monero.Wallet_pauseRefresh(walletPtr); } - + @override String paymentIdFromAddress({required String strarg, required int nettype}) { return monero.Wallet_paymentIdFromAddress(nettype: nettype, strarg: strarg); } - + @override bool paymentIdValid(String paymentId) { return monero.Wallet_paymentIdValid(paymentId); } - + @override String publicMultisigSignerKey() { return monero.Wallet_publicMultisigSignerKey(walletPtr); } - + @override String publicSpendKey() { return monero.Wallet_publicSpendKey(walletPtr); } - + @override String publicViewKey() { return monero.Wallet_publicViewKey(walletPtr); } - + @override bool reconnectDevice() { return monero.Wallet_reconnectDevice(walletPtr); } - + @override bool refresh() { return monero.Wallet_refresh(walletPtr); } - + @override void refreshAsync() { monero.Wallet_refreshAsync(walletPtr); } - + @override bool rescanBlockchain() { return monero.Wallet_rescanBlockchain(walletPtr); } - + @override void rescanBlockchainAsync() { monero.Wallet_rescanBlockchainAsync(walletPtr); } - + @override bool rescanSpent() { return monero.Wallet_rescanSpent(walletPtr); } - + @override - Wallet2PendingTransaction restoreMultisigTransaction({required String signData}) { - final tx = monero.Wallet_restoreMultisigTransaction(walletPtr, signData: signData); + Wallet2PendingTransaction restoreMultisigTransaction( + {required String signData}) { + final tx = + monero.Wallet_restoreMultisigTransaction(walletPtr, signData: signData); return MoneroPendingTransaction(tx); } - + @override String secretSpendKey() { return monero.Wallet_secretSpendKey(walletPtr); } - + @override String secretViewKey() { return monero.Wallet_secretViewKey(walletPtr); } - + @override String seed({required String seedOffset}) { return monero.Wallet_seed(walletPtr, seedOffset: seedOffset); } - + @override void segregatePreForkOutputs({required bool segregate}) { monero.Wallet_segregatePreForkOutputs(walletPtr, segregate: segregate); } - + @override void segregationHeight({required int height}) { monero.Wallet_segregationHeight(walletPtr, height: height); } - + @override void setAutoRefreshInterval({required int millis}) { monero.Wallet_setAutoRefreshInterval(walletPtr, millis: millis); } - + @override bool setCacheAttribute({required String key, required String value}) { return monero.Wallet_setCacheAttribute(walletPtr, key: key, value: value); } - + @override void setDefaultMixin(int arg) { monero.Wallet_setDefaultMixin(walletPtr, arg); } - + @override bool setDevicePin({required String passphrase}) { return monero.Wallet_setDevicePin(walletPtr, passphrase: passphrase); } - + static void setDeviceReceivedData(Pointer<UnsignedChar> data, int len) { monero.Wallet_setDeviceReceivedData(data, len); } - + static void setDeviceSendData(Pointer<UnsignedChar> data, int len) { monero.Wallet_setDeviceSendData(data, len); } - static void setLedgerCallback(Pointer<NativeFunction<Void Function(Pointer<UnsignedChar>, UnsignedInt)>> callback) { + static void setLedgerCallback( + Pointer<NativeFunction<Void Function(Pointer<UnsignedChar>, UnsignedInt)>> + callback) { monero.Wallet_setLedgerCallback(callback); } - + @override void setOffline({required bool offline}) { monero.Wallet_setOffline(walletPtr, offline: offline); } - + @override bool setPassword({required String password}) { return monero.Wallet_setPassword(walletPtr, password: password); } - + @override void setProxy({required String address}) { monero.Wallet_setProxy(walletPtr, address: address); } - + @override void setRecoveringFromDevice({required bool recoveringFromDevice}) { - monero.Wallet_setRecoveringFromDevice(walletPtr, recoveringFromDevice: recoveringFromDevice); + monero.Wallet_setRecoveringFromDevice(walletPtr, + recoveringFromDevice: recoveringFromDevice); } - + @override void setRecoveringFromSeed({required bool recoveringFromSeed}) { - monero.Wallet_setRecoveringFromSeed(walletPtr, recoveringFromSeed: recoveringFromSeed); + monero.Wallet_setRecoveringFromSeed(walletPtr, + recoveringFromSeed: recoveringFromSeed); } - + @override void setRefreshFromBlockHeight({required int refresh_from_block_height}) { - monero.Wallet_setRefreshFromBlockHeight(walletPtr, refresh_from_block_height: refresh_from_block_height); + monero.Wallet_setRefreshFromBlockHeight(walletPtr, + refresh_from_block_height: refresh_from_block_height); } - + @override void setSeedLanguage({required String language}) { monero.Wallet_setSeedLanguage(walletPtr, language: language); } - + @override - void setSubaddressLabel({required int accountIndex, required int addressIndex, required String label}) { - monero.Wallet_setSubaddressLabel(walletPtr, accountIndex: accountIndex, addressIndex: addressIndex, label: label); + void setSubaddressLabel( + {required int accountIndex, + required int addressIndex, + required String label}) { + monero.Wallet_setSubaddressLabel(walletPtr, + accountIndex: accountIndex, addressIndex: addressIndex, label: label); } - + @override void setSubaddressLookahead({required int major, required int minor}) { monero.Wallet_setSubaddressLookahead(walletPtr, major: major, minor: minor); } - + @override void setTrustedDaemon({required bool arg}) { monero.Wallet_setTrustedDaemon(walletPtr, arg: arg); } - + @override bool setUserNote({required String txid, required String note}) { return monero.Wallet_setUserNote(walletPtr, txid: txid, note: note); } - + @override - bool setupBackgroundSync({required int backgroundSyncType, required String walletPassword, required String backgroundCachePassword}) { - return monero.Wallet_setupBackgroundSync(walletPtr, backgroundSyncType: backgroundSyncType, walletPassword: walletPassword, backgroundCachePassword: backgroundCachePassword); + bool setupBackgroundSync( + {required int backgroundSyncType, + required String walletPassword, + required String backgroundCachePassword}) { + return monero.Wallet_setupBackgroundSync(walletPtr, + backgroundSyncType: backgroundSyncType, + walletPassword: walletPassword, + backgroundCachePassword: backgroundCachePassword); } - + @override String signMessage({required String message, required String address}) { - return monero.Wallet_signMessage(walletPtr, message: message, address: address); + return monero.Wallet_signMessage(walletPtr, + message: message, address: address); } - + @override bool startBackgroundSync() { return monero.Wallet_startBackgroundSync(walletPtr); } - + @override void startRefresh() { monero.Wallet_startRefresh(walletPtr); } - + @override int status() { return monero.Wallet_status(walletPtr); } - + @override void stop() { monero.Wallet_stop(walletPtr); } - + @override bool stopBackgroundSync(String walletPassword) { return monero.Wallet_stopBackgroundSync(walletPtr, walletPassword); } - + @override bool store({String path = ""}) { return monero.Wallet_store(walletPtr, path: path); } - + @override Wallet2Subaddress subaddress() { return MoneroSubaddress(monero.Wallet_subaddress(walletPtr)); } - + @override Wallet2SubaddressAccount subaddressAccount() { return MoneroSubaddressAccount(monero.Wallet_subaddressAccount(walletPtr)); } - + @override bool submitTransaction(String filename) { return monero.Wallet_submitTransaction(walletPtr, filename); } - + @override bool submitTransactionUR(String input) { return monero.Wallet_submitTransactionUR(walletPtr, input); } - + @override bool synchronized() { return monero.Wallet_synchronized(walletPtr); } - + @override bool trustedDaemon() { return monero.Wallet_trustedDaemon(walletPtr); } - + @override bool unlockKeysFile() { return monero.Wallet_unlockKeysFile(walletPtr); } - + @override int unlockedBalance({required int accountIndex}) { return monero.Wallet_unlockedBalance(walletPtr, accountIndex: accountIndex); } - + @override int useForkRules({required int version, required int earlyBlocks}) { - return monero.Wallet_useForkRules(walletPtr, version: version, earlyBlocks: earlyBlocks); + return monero.Wallet_useForkRules(walletPtr, + version: version, earlyBlocks: earlyBlocks); } - + @override - bool verifySignedMessage({required String message, required String address, required String signature}) { - return monero.Wallet_verifySignedMessage(walletPtr, message: message, address: address, signature: signature); + bool verifySignedMessage( + {required String message, + required String address, + required String signature}) { + return monero.Wallet_verifySignedMessage(walletPtr, + message: message, address: address, signature: signature); } - + @override int viewOnlyBalance({required int accountIndex}) { return monero.Wallet_viewOnlyBalance(walletPtr, accountIndex: accountIndex); } - + @override bool watchOnly() { return monero.Wallet_watchOnly(walletPtr); @@ -1528,7 +1664,7 @@ class MoneroWallet implements Wallet2Wallet { final l = parseTrezorTdis(res); return l; } - + @override int ffiAddress() => walletPtr.address; } @@ -1553,8 +1689,8 @@ class TrezorTdi { factory TrezorTdi.fromJson(Map<String, dynamic> j) => TrezorTdi( outKey: j['out_key'] as String, txPubKey: j['tx_pub_key'] as String, - additionalTxPubKeys: (j['additional_tx_pub_keys'] as List?) - ?.cast<String>(), + additionalTxPubKeys: + (j['additional_tx_pub_keys'] as List?)?.cast<String>(), internalOutputIndex: (j['internal_output_index'] as num).toInt(), subAddrMajor: (j['sub_addr_major'] as num).toInt(), subAddrMinor: (j['sub_addr_minor'] as num).toInt(), @@ -1572,124 +1708,233 @@ class MoneroWalletManager implements Wallet2WalletManager { MoneroWalletManager(this.wmPtr); final monero.WalletManager wmPtr; - + @override Future<int> blockTarget() async { return monero.WalletManager_blockTarget(wmPtr); } - + @override Future<int> blockchainHeight() async { return monero.WalletManager_blockchainHeight(wmPtr); } - + @override Future<int> blockchainTargetHeight() async { return monero.WalletManager_blockchainTargetHeight(wmPtr); } - + @override - Wallet2Wallet createDeterministicWalletFromSpendKey({required String path, required String password, String language = "English", int networkType = 0, required String spendKeyString, required bool newWallet, required int restoreHeight, int kdfRounds = 1}) { - final wallet = monero.WalletManager_createDeterministicWalletFromSpendKey(wmPtr, path: path, password: password, language: language, networkType: networkType, spendKeyString: spendKeyString, newWallet: newWallet, restoreHeight: restoreHeight, kdfRounds: kdfRounds); + Wallet2Wallet createDeterministicWalletFromSpendKey( + {required String path, + required String password, + String language = "English", + int networkType = 0, + required String spendKeyString, + required bool newWallet, + required int restoreHeight, + int kdfRounds = 1}) { + final wallet = monero.WalletManager_createDeterministicWalletFromSpendKey( + wmPtr, + path: path, + password: password, + language: language, + networkType: networkType, + spendKeyString: spendKeyString, + newWallet: newWallet, + restoreHeight: restoreHeight, + kdfRounds: kdfRounds); return MoneroWallet(wallet); } - + @override - Wallet2Wallet createWallet({required String path, required String password, String language = "English", int networkType = 0}) { - final wallet = monero.WalletManager_createWallet(wmPtr, path: path, password: password, language: language, networkType: networkType); + Wallet2Wallet createWallet( + {required String path, + required String password, + String language = "English", + int networkType = 0}) { + final wallet = monero.WalletManager_createWallet(wmPtr, + path: path, + password: password, + language: language, + networkType: networkType); return MoneroWallet(wallet); } - + @override - Wallet2Wallet createWalletFromDevice({required String path, required String password, int networkType = 0, required String deviceName, int restoreHeight = 0, String subaddressLookahead = "", int kdfRounds = 1}) { - final wallet = monero.WalletManager_createWalletFromDevice(wmPtr, path: path, password: password, deviceName: deviceName, restoreHeight: restoreHeight, subaddressLookahead: subaddressLookahead, kdfRounds: kdfRounds); + Wallet2Wallet createWalletFromDevice( + {required String path, + required String password, + int networkType = 0, + required String deviceName, + int restoreHeight = 0, + String subaddressLookahead = "", + int kdfRounds = 1}) { + final wallet = monero.WalletManager_createWalletFromDevice(wmPtr, + path: path, + password: password, + deviceName: deviceName, + restoreHeight: restoreHeight, + subaddressLookahead: subaddressLookahead, + kdfRounds: kdfRounds); return MoneroWallet(wallet); } - + @override - Wallet2Wallet createWalletFromKeys({required String path, required String password, String language = "English", int nettype = 1, required int restoreHeight, required String addressString, required String viewKeyString, required String spendKeyString, int kdf_rounds = 1}) { - final wallet = monero.WalletManager_createWalletFromKeys(wmPtr, path: path, password: password, language: language, nettype: nettype, restoreHeight: restoreHeight, addressString: addressString, viewKeyString: viewKeyString, spendKeyString: spendKeyString); + Wallet2Wallet createWalletFromKeys( + {required String path, + required String password, + String language = "English", + int nettype = 1, + required int restoreHeight, + required String addressString, + required String viewKeyString, + required String spendKeyString, + int kdf_rounds = 1}) { + final wallet = monero.WalletManager_createWalletFromKeys(wmPtr, + path: path, + password: password, + language: language, + nettype: nettype, + restoreHeight: restoreHeight, + addressString: addressString, + viewKeyString: viewKeyString, + spendKeyString: spendKeyString); return MoneroWallet(wallet); } - + @override - Wallet2Wallet createWalletFromPolyseed({required String path, required String password, int networkType = 0, required String mnemonic, required String seedOffset, required bool newWallet, required int restoreHeight, required int kdfRounds}) { - final wallet = monero.WalletManager_createWalletFromPolyseed(wmPtr, path: path, password: password, networkType: networkType, mnemonic: mnemonic, seedOffset: seedOffset, newWallet: newWallet, restoreHeight: restoreHeight, kdfRounds: kdfRounds); + Wallet2Wallet createWalletFromPolyseed( + {required String path, + required String password, + int networkType = 0, + required String mnemonic, + required String seedOffset, + required bool newWallet, + required int restoreHeight, + required int kdfRounds}) { + final wallet = monero.WalletManager_createWalletFromPolyseed(wmPtr, + path: path, + password: password, + networkType: networkType, + mnemonic: mnemonic, + seedOffset: seedOffset, + newWallet: newWallet, + restoreHeight: restoreHeight, + kdfRounds: kdfRounds); return MoneroWallet(wallet); } - + @override String errorString() { return monero.WalletManager_errorString(wmPtr); } - + @override List<String> findWallets({required String path}) { return monero.WalletManager_findWallets(wmPtr, path: path); } - + @override bool isMining() { return monero.WalletManager_isMining(wmPtr); } - + @override double miningHashRate() { return monero.WalletManager_miningHashRate(wmPtr); } - + @override int networkDifficulty() { return monero.WalletManager_networkDifficulty(wmPtr); } - + @override - Wallet2Wallet openWallet({required String path, required String password, int networkType = 0}) { - final wallet = monero.WalletManager_openWallet(wmPtr, path: path, password: password, networkType: networkType); + Wallet2Wallet openWallet( + {required String path, required String password, int networkType = 0}) { + final wallet = monero.WalletManager_openWallet(wmPtr, + path: path, password: password, networkType: networkType); return MoneroWallet(wallet); } - - @override - int queryWalletDevice({required String keysFileName, required String password, required int kdfRounds}) { - return monero.WalletManager_queryWalletDevice(wmPtr, keysFileName: keysFileName, password: password, kdfRounds: kdfRounds); - } - + @override - Wallet2Wallet recoveryWallet({required String path, required String password, required String mnemonic, int networkType = 0, required int restoreHeight, int kdfRounds = 0, required String seedOffset}) { - final wallet = monero.WalletManager_recoveryWallet(wmPtr, path: path, password: password, mnemonic: mnemonic, networkType: networkType, restoreHeight: restoreHeight, kdfRounds: kdfRounds, seedOffset: seedOffset); + int queryWalletDevice( + {required String keysFileName, + required String password, + required int kdfRounds}) { + return monero.WalletManager_queryWalletDevice(wmPtr, + keysFileName: keysFileName, password: password, kdfRounds: kdfRounds); + } + + @override + Wallet2Wallet recoveryWallet( + {required String path, + required String password, + required String mnemonic, + int networkType = 0, + required int restoreHeight, + int kdfRounds = 0, + required String seedOffset}) { + final wallet = monero.WalletManager_recoveryWallet(wmPtr, + path: path, + password: password, + mnemonic: mnemonic, + networkType: networkType, + restoreHeight: restoreHeight, + kdfRounds: kdfRounds, + seedOffset: seedOffset); return MoneroWallet(wallet); } - + @override - String resolveOpenAlias({required String address, required bool dnssecValid}) { - return monero.WalletManager_resolveOpenAlias(wmPtr, address: address, dnssecValid: dnssecValid); + String resolveOpenAlias( + {required String address, required bool dnssecValid}) { + return monero.WalletManager_resolveOpenAlias(wmPtr, + address: address, dnssecValid: dnssecValid); } - + @override void setDaemonAddress(String address) { monero.WalletManager_setDaemonAddress(wmPtr, address); } - + @override bool setProxy(String address) { return monero.WalletManager_setProxy(wmPtr, address); } - + @override - bool startMining({required String address, required int threads, required bool backgroundMining, required bool ignoreBattery}) { - return monero.WalletManager_startMining(wmPtr, address: address, threads: threads, backgroundMining: backgroundMining, ignoreBattery: ignoreBattery); + bool startMining( + {required String address, + required int threads, + required bool backgroundMining, + required bool ignoreBattery}) { + return monero.WalletManager_startMining(wmPtr, + address: address, + threads: threads, + backgroundMining: backgroundMining, + ignoreBattery: ignoreBattery); } - + @override bool stopMining(String address) { return monero.WalletManager_stopMining(wmPtr, address); } - + @override - bool verifyWalletPassword({required String keysFileName, required String password, required bool noSpendKey, required int kdfRounds}) { - return monero.WalletManager_verifyWalletPassword(wmPtr, keysFileName: keysFileName, password: password, noSpendKey: noSpendKey, kdfRounds: kdfRounds); + bool verifyWalletPassword( + {required String keysFileName, + required String password, + required bool noSpendKey, + required int kdfRounds}) { + return monero.WalletManager_verifyWalletPassword(wmPtr, + keysFileName: keysFileName, + password: password, + noSpendKey: noSpendKey, + kdfRounds: kdfRounds); } - + @override bool walletExists(String path) { return monero.WalletManager_walletExists(wmPtr, path); @@ -1697,10 +1942,11 @@ class MoneroWalletManager implements Wallet2WalletManager { @override int ffiAddress() => wmPtr.address; - + @override void closeWallet(Wallet2Wallet wallet, bool store) { - monero.WalletManager_closeWallet(wmPtr, Pointer.fromAddress(wallet.ffiAddress()), store); + monero.WalletManager_closeWallet( + wmPtr, Pointer.fromAddress(wallet.ffiAddress()), store); } } diff --git a/impls/monero.dart/lib/src/wallet2.dart b/impls/monero.dart/lib/src/wallet2.dart index 655862d..309621d 100644 --- a/impls/monero.dart/lib/src/wallet2.dart +++ b/impls/monero.dart/lib/src/wallet2.dart @@ -2,9 +2,10 @@ import 'dart:ffi'; import 'dart:io'; + abstract class Wallet2 { Wallet2WalletManagerFactory walletManagerFactory(); - + static String get libPath { if (Platform.isWindows) return 'unknown_libwallet2_api_c.dll'; if (Platform.isMacOS) return 'unknown_libwallet2_api_c.dylib'; @@ -12,10 +13,12 @@ abstract class Wallet2 { if (Platform.isAndroid) return 'libunknown_libwallet2_api_c.so'; return 'unknown_libwallet2_api_c.so'; } + static set libPath(String path) { - throw Exception('libPath is read-only, as isolates cannot be made aware of changes to this variable'); + throw Exception( + 'libPath is read-only, as isolates cannot be made aware of changes to this variable'); } - + int ffiAddress(); } @@ -24,9 +27,16 @@ abstract class Wallet2AddressBook { int getAll_size(); Wallet2AddressBookRow getAll_byIndex(int index); - bool addRow({required String dstAddr, required String paymentId, required String description, }); + bool addRow({ + required String dstAddr, + required String paymentId, + required String description, + }); bool deleteRow({required int rowId}); - bool setDescription({required int rowId, required String description, }); + bool setDescription({ + required int rowId, + required String description, + }); void refresh(); int errorCode(); int lookupPaymentID({required String paymentId}); @@ -149,7 +159,10 @@ abstract class Wallet2Subaddress { int getAll_size(); Wallet2SubaddressRow getAll_byIndex(int index); void addRow({required int accountIndex, required String label}); - void setLabel({required int accountIndex, required int addressIndex, required String label}); + void setLabel( + {required int accountIndex, + required int addressIndex, + required String label}); void refresh({required int accountIndex, required String label}); } @@ -232,7 +245,6 @@ abstract class Wallet2UnsignedTransaction { int txCount(); bool sign(String signedFileName); String signUR(int max_fragment_length); - String commitTrezor(int tx_index); } abstract class Wallet2Wallet { @@ -249,7 +261,10 @@ abstract class Wallet2Wallet { String address({int accountIndex = 0, int addressIndex = 0}); String path(); int nettype(); - int useForkRules({required int version, required int earlyBlocks, }); + int useForkRules({ + required int version, + required int earlyBlocks, + }); String integratedAddress({required String paymentId}); String secretViewKey(); String publicViewKey(); @@ -260,8 +275,20 @@ abstract class Wallet2Wallet { bool store({String path = ""}); String filename(); String keysFilename(); - bool init({ required String daemonAddress, int upperTransacationSizeLimit = 0, String daemonUsername = "", String daemonPassword = "", bool useSsl = false, bool lightWallet = false, String proxyAddress = "", }); - bool createWatchOnly({ required String path, required String password, required String language, }); + bool init({ + required String daemonAddress, + int upperTransacationSizeLimit = 0, + String daemonUsername = "", + String daemonPassword = "", + bool useSsl = false, + bool lightWallet = false, + String proxyAddress = "", + }); + bool createWatchOnly({ + required String path, + required String password, + required String language, + }); void setRefreshFromBlockHeight({required int refresh_from_block_height}); int getRefreshFromBlockHeight(); void setRecoveringFromSeed({required bool recoveringFromSeed}); @@ -287,13 +314,28 @@ abstract class Wallet2Wallet { String genPaymentId(); bool paymentIdValid(String paymentId); bool addressValid(String address, int networkType); - bool keyValid({required String secret_key_string, required String address_string, required bool isViewKey, required int nettype}); - String keyValid_error({required String secret_key_string, required String address_string, required bool isViewKey, required int nettype}); + bool keyValid( + {required String secret_key_string, + required String address_string, + required bool isViewKey, + required int nettype}); + String keyValid_error( + {required String secret_key_string, + required String address_string, + required bool isViewKey, + required int nettype}); String paymentIdFromAddress({required String strarg, required int nettype}); int maximumAllowedAmount(); - void init3({ required String argv0, required String defaultLogBaseName, required String logPath, required bool console, }); + void init3({ + required String argv0, + required String defaultLogBaseName, + required String logPath, + required bool console, + }); String getPolyseed({required String passphrase}); - String createPolyseed({ String language = "English", }); + String createPolyseed({ + String language = "English", + }); void startRefresh(); void pauseRefresh(); bool refresh(); @@ -306,32 +348,76 @@ abstract class Wallet2Wallet { void addSubaddressAccount({String label = ""}); int numSubaddressAccounts(); int numSubaddresses({required int accountIndex}); - String getSubaddressLabel({required int accountIndex, required int addressIndex}); - void setSubaddressLabel({required int accountIndex, required int addressIndex, required String label}); + String getSubaddressLabel( + {required int accountIndex, required int addressIndex}); + void setSubaddressLabel( + {required int accountIndex, + required int addressIndex, + required String label}); Wallet2MultisigState multisig(); String getMultisigInfo(); - String makeMultisig({ required List<String> info, required int threshold, }); - String exchangeMultisigKeys({ required List<String> info, required bool force_update_use_with_caution, }); - List<String> exportMultisigImages({ required List<String> info, }); - int importMultisigImages({ required List<String> info, }); + String makeMultisig({ + required List<String> info, + required int threshold, + }); + String exchangeMultisigKeys({ + required List<String> info, + required bool force_update_use_with_caution, + }); + List<String> exportMultisigImages({ + required List<String> info, + }); + int importMultisigImages({ + required List<String> info, + }); int hasMultisigPartialKeyImages(); - Wallet2PendingTransaction restoreMultisigTransaction({ required String signData, }); - Wallet2PendingTransaction createTransactionMultDest({ required List<String> dstAddr, String paymentId = "", required bool isSweepAll, required List<int> amounts, required int mixinCount, required int pendingTransactionPriority, required int subaddr_account, List<String> preferredInputs = const [], }); - Wallet2PendingTransaction createTransaction({required String dst_addr, required String payment_id, required int amount, required int mixin_count, required int pendingTransactionPriority, required int subaddr_account, List<String> preferredInputs = const [],}); - Wallet2UnsignedTransaction loadUnsignedTx({required String unsigned_filename}); + Wallet2PendingTransaction restoreMultisigTransaction({ + required String signData, + }); + Wallet2PendingTransaction createTransactionMultDest({ + required List<String> dstAddr, + String paymentId = "", + required bool isSweepAll, + required List<int> amounts, + required int mixinCount, + required int pendingTransactionPriority, + required int subaddr_account, + List<String> preferredInputs = const [], + }); + Wallet2PendingTransaction createTransaction({ + required String dst_addr, + required String payment_id, + required int amount, + required int mixin_count, + required int pendingTransactionPriority, + required int subaddr_account, + List<String> preferredInputs = const [], + }); + Wallet2UnsignedTransaction loadUnsignedTx( + {required String unsigned_filename}); Wallet2UnsignedTransaction loadUnsignedTxUR({required String input}); bool submitTransaction(String filename); bool submitTransactionUR(String input); bool hasUnknownKeyImages(); bool exportKeyImages(String filename, {required bool all}); - String exportKeyImagesUR({ int max_fragment_length = 130, bool all = false, }); + String exportKeyImagesUR({ + int max_fragment_length = 130, + bool all = false, + }); bool importKeyImages(String filename); bool importKeyImagesUR(String input); bool exportOutputs(String filename, {required bool all}); - String exportOutputsUR({ int max_fragment_length = 130, bool all = false, }); + String exportOutputsUR({ + int max_fragment_length = 130, + bool all = false, + }); bool importOutputs(String filename); bool importOutputsUR(String input); - bool setupBackgroundSync({ required int backgroundSyncType, required String walletPassword, required String backgroundCachePassword, }); + bool setupBackgroundSync({ + required int backgroundSyncType, + required String walletPassword, + required String backgroundCachePassword, + }); int getBackgroundSyncType(); bool startBackgroundSync(); bool stopBackgroundSync(String walletPassword); @@ -349,8 +435,15 @@ abstract class Wallet2Wallet { bool setUserNote({required String txid, required String note}); String getUserNote({required String txid}); String getTxKey({required String txid}); - String signMessage({ required String message, required String address, }); - bool verifySignedMessage({ required String message, required String address, required String signature, }); + String signMessage({ + required String message, + required String address, + }); + bool verifySignedMessage({ + required String message, + required String address, + required String signature, + }); bool rescanSpent(); void setOffline({required bool offline}); bool isOffline(); @@ -362,7 +455,8 @@ abstract class Wallet2Wallet { bool isKeysFileLocked(); int getDeviceType(); int coldKeyImageSync({required int spent, required int unspent}); - String deviceShowAddress({required int accountIndex, required int addressIndex}); + String deviceShowAddress( + {required int accountIndex, required int addressIndex}); bool reconnectDevice(); int getBytesReceived(); int getBytesSent(); @@ -372,17 +466,79 @@ abstract class Wallet2Wallet { abstract class Wallet2WalletManager { int ffiAddress(); - Wallet2Wallet createWallet({ required String path, required String password, String language = "English", int networkType = 0, }); - Wallet2Wallet openWallet({ required String path, required String password, int networkType = 0, }); + Wallet2Wallet createWallet({ + required String path, + required String password, + String language = "English", + int networkType = 0, + }); + Wallet2Wallet openWallet({ + required String path, + required String password, + int networkType = 0, + }); void closeWallet(Wallet2Wallet wallet, bool store); - Wallet2Wallet recoveryWallet({ required String path, required String password, required String mnemonic, int networkType = 0, required int restoreHeight, int kdfRounds = 0, required String seedOffset, }); - Wallet2Wallet createWalletFromKeys({ required String path, required String password, String language = "English", int nettype = 1, required int restoreHeight, required String addressString, required String viewKeyString, required String spendKeyString, int kdf_rounds = 1, }); - Wallet2Wallet createDeterministicWalletFromSpendKey({ required String path, required String password, String language = "English", int networkType = 0, required String spendKeyString, required bool newWallet, required int restoreHeight, int kdfRounds = 1, }); - Wallet2Wallet createWalletFromDevice({ required String path, required String password, int networkType = 0, required String deviceName, int restoreHeight = 0, String subaddressLookahead = "", int kdfRounds = 1, }); - Wallet2Wallet createWalletFromPolyseed({ required String path, required String password, int networkType = 0, required String mnemonic, required String seedOffset, required bool newWallet, required int restoreHeight, required int kdfRounds, }); + Wallet2Wallet recoveryWallet({ + required String path, + required String password, + required String mnemonic, + int networkType = 0, + required int restoreHeight, + int kdfRounds = 0, + required String seedOffset, + }); + Wallet2Wallet createWalletFromKeys({ + required String path, + required String password, + String language = "English", + int nettype = 1, + required int restoreHeight, + required String addressString, + required String viewKeyString, + required String spendKeyString, + int kdf_rounds = 1, + }); + Wallet2Wallet createDeterministicWalletFromSpendKey({ + required String path, + required String password, + String language = "English", + int networkType = 0, + required String spendKeyString, + required bool newWallet, + required int restoreHeight, + int kdfRounds = 1, + }); + Wallet2Wallet createWalletFromDevice({ + required String path, + required String password, + int networkType = 0, + required String deviceName, + int restoreHeight = 0, + String subaddressLookahead = "", + int kdfRounds = 1, + }); + Wallet2Wallet createWalletFromPolyseed({ + required String path, + required String password, + int networkType = 0, + required String mnemonic, + required String seedOffset, + required bool newWallet, + required int restoreHeight, + required int kdfRounds, + }); bool walletExists(String path); - bool verifyWalletPassword({ required String keysFileName, required String password, required bool noSpendKey, required int kdfRounds, }); - int queryWalletDevice({ required String keysFileName, required String password, required int kdfRounds, }); + bool verifyWalletPassword({ + required String keysFileName, + required String password, + required bool noSpendKey, + required int kdfRounds, + }); + int queryWalletDevice({ + required String keysFileName, + required String password, + required int kdfRounds, + }); List<String> findWallets({required String path}); String errorString(); void setDaemonAddress(String address); @@ -392,9 +548,17 @@ abstract class Wallet2WalletManager { double miningHashRate(); Future<int> blockTarget(); bool isMining(); - bool startMining({ required String address, required int threads, required bool backgroundMining, required bool ignoreBattery, }); + bool startMining({ + required String address, + required int threads, + required bool backgroundMining, + required bool ignoreBattery, + }); bool stopMining(String address); - String resolveOpenAlias({ required String address, required bool dnssecValid, }); + String resolveOpenAlias({ + required String address, + required bool dnssecValid, + }); bool setProxy(String address); } @@ -404,4 +568,4 @@ abstract class Wallet2WalletManagerFactory { void setLogLevel(int level); void setLogCategories(String categories); Wallet2WalletManager getWalletManager(); -}
\ No newline at end of file +} diff --git a/monero_libwallet2_api_c/src/main/cpp/monero_wallet2_api_c.cpp b/monero_libwallet2_api_c/src/main/cpp/monero_wallet2_api_c.cpp index a800ad5..391cb65 100644 --- a/monero_libwallet2_api_c/src/main/cpp/monero_wallet2_api_c.cpp +++ b/monero_libwallet2_api_c/src/main/cpp/monero_wallet2_api_c.cpp @@ -102,6 +102,15 @@ const char* MONERO_PendingTransaction_commitUR(void* pendingTx_ptr, int max_frag DEBUG_END() } + +const char* MONERO_PendingTransaction_commitTrezor(void* pendingTx_ptr, int tx_index) { + DEBUG_START() + Monero::PendingTransaction *pendingTx = reinterpret_cast<Monero::PendingTransaction*>(pendingTx_ptr); + std::string str = pendingTx->commitTrezor(tx_index); + return strdup(str.c_str()); + DEBUG_END() +} + uint64_t MONERO_PendingTransaction_amount(void* pendingTx_ptr) { DEBUG_START() Monero::PendingTransaction *pendingTx = reinterpret_cast<Monero::PendingTransaction*>(pendingTx_ptr); @@ -266,13 +275,6 @@ const char* MONERO_UnsignedTransaction_signUR(void* unsignedTx_ptr, int max_frag DEBUG_END() } -const char* MONERO_UnsignedTransaction_commitTrezor(void* unsignedTx_ptr, int tx_index) { - DEBUG_START() - Monero::UnsignedTransaction *unsignedTx = reinterpret_cast<Monero::UnsignedTransaction*>(unsignedTx_ptr); - std::string str = unsignedTx->commitTrezor(tx_index); - return strdup(str.c_str()); - DEBUG_END() -} // TransactionInfo const int MONERO_TransactionInfoDirection_In = 0; diff --git a/monero_libwallet2_api_c/src/main/cpp/monero_wallet2_api_c.h b/monero_libwallet2_api_c/src/main/cpp/monero_wallet2_api_c.h index fdaf228..f30d233 100644 --- a/monero_libwallet2_api_c/src/main/cpp/monero_wallet2_api_c.h +++ b/monero_libwallet2_api_c/src/main/cpp/monero_wallet2_api_c.h @@ -84,6 +84,7 @@ extern ADDAPI const char* MONERO_PendingTransaction_errorString(void* pendingTx_ // virtual bool commit(const std::string &filename = "", bool overwrite = false) = 0; extern ADDAPI bool MONERO_PendingTransaction_commit(void* pendingTx_ptr, const char* filename, bool overwrite); extern ADDAPI const char* MONERO_PendingTransaction_commitUR(void* pendingTx_ptr, int max_fragment_length); +extern ADDAPI const char* MONERO_PendingTransaction_commitTrezor(void* pendingTx_ptr, int tx_index); // virtual uint64_t amount() const = 0; extern ADDAPI uint64_t MONERO_PendingTransaction_amount(void* pendingTx_ptr); // virtual uint64_t dust() const = 0; @@ -144,7 +145,6 @@ extern ADDAPI uint64_t MONERO_UnsignedTransaction_txCount(void* unsignedTx_ptr); // virtual bool sign(const std::string &signedFileName) = 0; extern ADDAPI bool MONERO_UnsignedTransaction_sign(void* unsignedTx_ptr, const char* signedFileName); extern ADDAPI const char* MONERO_UnsignedTransaction_signUR(void* unsignedTx_ptr, int max_fragment_length); -extern ADDAPI const char* MONERO_UnsignedTransaction_commitTrezor(void* unsignedTx_ptr, int tx_index); // }; // struct TransactionInfo // { diff --git a/patches/monero/0021-trezor-import-export-sign-functions.patch b/patches/monero/0021-trezor-import-export-sign-functions.patch index 6129263..8f89f01 100644 --- a/patches/monero/0021-trezor-import-export-sign-functions.patch +++ b/patches/monero/0021-trezor-import-export-sign-functions.patch @@ -1,22 +1,71 @@ -From 8a56c766201269bd06319b30bd7400fdb4610a27 Mon Sep 17 00:00:00 2001 +From b0fb84c69bba4cc6ffdd7c401a804c2d73089043 Mon Sep 17 00:00:00 2001 From: Czarek Nakamoto <cyjan@mrcyjanek.net> -Date: Fri, 8 May 2026 21:40:35 -0400 +Date: Wed, 13 May 2026 11:35:01 -0400 Subject: [PATCH] trezor import/export/sign functions --- - src/device_trezor/trezor/protocol.cpp | 250 ++++++++++++++++++++++++ + cmake/CheckTrezor.cmake | 28 +-- + src/device_trezor/trezor/protocol.cpp | 220 ++++++++++++++++++++++++ src/device_trezor/trezor/protocol.hpp | 8 + - src/wallet/api/unsigned_transaction.cpp | 60 ++++++ - src/wallet/api/unsigned_transaction.h | 1 + - src/wallet/api/wallet.cpp | 31 ++- + src/wallet/api/pending_transaction.cpp | 60 +++++++ + src/wallet/api/pending_transaction.h | 1 + + src/wallet/api/unsigned_transaction.cpp | 2 + + src/wallet/api/wallet.cpp | 31 +++- src/wallet/api/wallet.h | 2 + src/wallet/api/wallet2_api.h | 14 ++ - src/wallet/wallet2.cpp | 144 ++++++++++++++ - src/wallet/wallet2.h | 3 +- - 9 files changed, 511 insertions(+), 2 deletions(-) + src/wallet/wallet2.cpp | 158 +++++++++++++++++ + src/wallet/wallet2.h | 5 +- + 11 files changed, 500 insertions(+), 29 deletions(-) +diff --git a/cmake/CheckTrezor.cmake b/cmake/CheckTrezor.cmake +index 4fae15fad..57e3d4866 100644 +--- a/cmake/CheckTrezor.cmake ++++ b/cmake/CheckTrezor.cmake +@@ -40,9 +40,6 @@ if (USE_DEVICE_TREZOR) + # Protobuf handling the cache variables set in docker. + if(NOT Protobuf_FOUND AND NOT Protobuf_LIBRARY AND NOT Protobuf_PROTOC_EXECUTABLE AND NOT Protobuf_INCLUDE_DIR) + message(STATUS "Could not find Protobuf") +- elseif(NOT Protobuf_LIBRARY OR NOT EXISTS "${Protobuf_LIBRARY}") +- message(STATUS "Protobuf library not found: ${Protobuf_LIBRARY}") +- unset(Protobuf_FOUND) + elseif(NOT Protobuf_PROTOC_EXECUTABLE OR NOT EXISTS "${Protobuf_PROTOC_EXECUTABLE}") + message(STATUS "Protobuf executable not found: ${Protobuf_PROTOC_EXECUTABLE}") + unset(Protobuf_FOUND) +@@ -93,31 +90,8 @@ if(Protobuf_FOUND AND USE_DEVICE_TREZOR) + endif() + endif() + +-# Protobuf compilation test +-if(Protobuf_FOUND AND USE_DEVICE_TREZOR AND TREZOR_PYTHON) +- execute_process(COMMAND ${Protobuf_PROTOC_EXECUTABLE} -I "${CMAKE_CURRENT_LIST_DIR}" -I "${Protobuf_INCLUDE_DIR}" "${CMAKE_CURRENT_LIST_DIR}/test-protobuf.proto" --cpp_out ${CMAKE_BINARY_DIR} RESULT_VARIABLE RET OUTPUT_VARIABLE OUT ERROR_VARIABLE ERR) +- if(RET) +- message(STATUS "Protobuf test generation failed: ${OUT} ${ERR}") +- endif() +- +- try_compile(Protobuf_COMPILE_TEST_PASSED +- "${CMAKE_BINARY_DIR}" +- SOURCES +- "${CMAKE_BINARY_DIR}/test-protobuf.pb.cc" +- "${CMAKE_CURRENT_LIST_DIR}/test-protobuf.cpp" +- CMAKE_FLAGS +- "-DINCLUDE_DIRECTORIES=${Protobuf_INCLUDE_DIR};${CMAKE_BINARY_DIR}" +- "-DCMAKE_CXX_STANDARD=11" +- LINK_LIBRARIES ${Protobuf_LIBRARY} +- OUTPUT_VARIABLE OUTPUT +- ) +- if(NOT Protobuf_COMPILE_TEST_PASSED) +- message(STATUS "Protobuf Compilation test failed: ${OUTPUT}.") +- endif() +-endif() +- + # Try to build protobuf messages +-if(Protobuf_FOUND AND USE_DEVICE_TREZOR AND TREZOR_PYTHON AND Protobuf_COMPILE_TEST_PASSED) ++if(Protobuf_FOUND AND USE_DEVICE_TREZOR AND TREZOR_PYTHON) + set(ENV{PROTOBUF_INCLUDE_DIRS} "${Protobuf_INCLUDE_DIR}") + set(ENV{PROTOBUF_PROTOC_EXECUTABLE} "${Protobuf_PROTOC_EXECUTABLE}") + set(TREZOR_PROTOBUF_PARAMS "") diff --git a/src/device_trezor/trezor/protocol.cpp b/src/device_trezor/trezor/protocol.cpp -index 0e59a16ba..4f146e3f1 100644 +index 0e59a16ba..afd1498d2 100644 --- a/src/device_trezor/trezor/protocol.cpp +++ b/src/device_trezor/trezor/protocol.cpp @@ -29,12 +29,17 @@ @@ -48,7 +97,7 @@ index 0e59a16ba..4f146e3f1 100644 void Signer::set_tx_input(MoneroTransactionSourceEntry * dst, size_t idx, bool need_ring_keys, bool need_ring_indices){ const cryptonote::tx_source_entry & src = cur_tx().sources[idx]; const tools::wallet2::transfer_details & transfer = get_source_transfer(idx); -@@ -1096,6 +1105,247 @@ namespace tx { +@@ -1096,6 +1105,217 @@ namespace tx { memwipe(plaintext.get(), keys_len); } @@ -145,36 +194,6 @@ index 0e59a16ba..4f146e3f1 100644 + } + if (e.has_subaddr_minor()) + o.AddMember("subaddr_minor", e.subaddr_minor(), a); -+ if (e.has_multisig_klrki()) -+ { -+ const auto &ms = e.multisig_klrki(); -+ const bool any = (ms.has_k() && !ms.k().empty()) || (ms.has_l() && !ms.l().empty()) || (ms.has_r() && !ms.r().empty()) || (ms.has_ki() && !ms.ki().empty()); -+ if (any) -+ { -+ rapidjson::Value mso(rapidjson::kObjectType); -+ if (ms.has_k()) -+ { -+ const std::string h = bin_to_hex_lower(ms.k()); -+ mso.AddMember("K", rapidjson::Value(h.c_str(), static_cast<rapidjson::SizeType>(h.size()), a), a); -+ } -+ if (ms.has_l()) -+ { -+ const std::string h = bin_to_hex_lower(ms.l()); -+ mso.AddMember("L", rapidjson::Value(h.c_str(), static_cast<rapidjson::SizeType>(h.size()), a), a); -+ } -+ if (ms.has_r()) -+ { -+ const std::string h = bin_to_hex_lower(ms.r()); -+ mso.AddMember("R", rapidjson::Value(h.c_str(), static_cast<rapidjson::SizeType>(h.size()), a), a); -+ } -+ if (ms.has_ki()) -+ { -+ const std::string h = bin_to_hex_lower(ms.ki()); -+ mso.AddMember("ki", rapidjson::Value(h.c_str(), static_cast<rapidjson::SizeType>(h.size()), a), a); -+ } -+ o.AddMember("multisig_klrki", mso, a); -+ } -+ } + return o; + } + @@ -317,21 +336,11 @@ index 7ffadd9aa..7899e60d0 100644 // TX Key decryption void load_tx_key_data(hw::device_cold::tx_key_data_t & res, const std::string & data); -diff --git a/src/wallet/api/unsigned_transaction.cpp b/src/wallet/api/unsigned_transaction.cpp -index fd03e959d..d45723bb5 100644 ---- a/src/wallet/api/unsigned_transaction.cpp -+++ b/src/wallet/api/unsigned_transaction.cpp -@@ -34,14 +34,21 @@ - - #include "cryptonote_basic/cryptonote_format_utils.h" - #include "cryptonote_basic/cryptonote_basic_impl.h" -+#include "cryptonote_config.h" - - #include <memory> - #include <vector> - #include <sstream> - #include <boost/format.hpp> -+#include <functional> +diff --git a/src/wallet/api/pending_transaction.cpp b/src/wallet/api/pending_transaction.cpp +index 1f714d229..22c09483d 100644 +--- a/src/wallet/api/pending_transaction.cpp ++++ b/src/wallet/api/pending_transaction.cpp +@@ -44,6 +44,11 @@ #include "bc-ur/src/bc-ur.hpp" @@ -343,11 +352,11 @@ index fd03e959d..d45723bb5 100644 using namespace std; namespace Monero { -@@ -138,6 +145,59 @@ std::string UnsignedTransactionImpl::signUR(int max_fragment_length) - return ""; +@@ -210,6 +215,61 @@ std::string PendingTransactionImpl::commitUR(int max_fragment_length) { + } } -+std::string UnsignedTransactionImpl::commitTrezor(uint64_t tx_index) ++std::string PendingTransactionImpl::commitTrezor(uint64_t tx_index) +{ +#if !defined(DEVICE_TREZOR_READY) || !DEVICE_TREZOR_READY + (void)tx_index; @@ -355,21 +364,23 @@ index fd03e959d..d45723bb5 100644 + m_status = Status_Error; + return ""; +#else -+ if (tx_index >= m_unsigned_tx_set.txes.size()) ++ if (tx_index >= m_pending_tx.size()) + { + m_errorString = tr("Invalid transaction index"); + m_status = Status_Error; + return ""; + } -+ if (std::get<0>(m_unsigned_tx_set.transfers) != 0) -+ { -+ m_errorString = tr("Unsupported unsigned transaction transfer offset"); -+ m_status = Status_Error; -+ return ""; -+ } + try + { + tools::wallet2 *w = m_wallet.m_wallet.get(); ++ tools::wallet2::unsigned_tx_set utx; ++ w->construct_unsigned_tx_set_for_signing(m_pending_tx, utx); ++ if (std::get<0>(utx.transfers) != 0) ++ { ++ m_errorString = tr("Unsupported unsigned transaction transfer offset"); ++ m_status = Status_Error; ++ return ""; ++ } + hw::tx_aux_data aux_data; + const int bpv = w->use_fork_rules(HF_VERSION_BULLETPROOF_PLUS, -10) ? 4 + : (w->use_fork_rules(HF_VERSION_CLSAG, -10) ? 3 @@ -383,7 +394,7 @@ index fd03e959d..d45723bb5 100644 + + const std::string json = hw::trezor::protocol::tx::trezor_connect_monero_sign_transaction_to_json( + &shim, -+ &m_unsigned_tx_set, ++ &utx, + static_cast<size_t>(tx_index), + &aux_data, + w->nettype()); @@ -400,20 +411,38 @@ index fd03e959d..d45723bb5 100644 +#endif +} + - //---------------------------------------------------------------------------------------------------- - bool UnsignedTransactionImpl::checkLoadedTx(const std::function<size_t()> get_num_txes, const std::function<const tools::wallet2::tx_construction_data&(size_t)> &get_tx, const std::string &extra_message) + + uint64_t PendingTransactionImpl::amount() const { -diff --git a/src/wallet/api/unsigned_transaction.h b/src/wallet/api/unsigned_transaction.h -index a94b23f75..e2f250565 100644 ---- a/src/wallet/api/unsigned_transaction.h -+++ b/src/wallet/api/unsigned_transaction.h -@@ -54,6 +54,7 @@ public: - // sign txs and save to file - bool sign(const std::string &signedFileName) override; - std::string signUR(int max_fragment_length = 130) override; +diff --git a/src/wallet/api/pending_transaction.h b/src/wallet/api/pending_transaction.h +index 0cc6c58e9..9c9097cd1 100644 +--- a/src/wallet/api/pending_transaction.h ++++ b/src/wallet/api/pending_transaction.h +@@ -47,6 +47,7 @@ public: + std::string errorString() const override; + bool commit(const std::string &filename = "", bool overwrite = false) override; + std::string commitUR(int max_fragment_length = 130) override; + std::string commitTrezor(uint64_t tx_index = 0) override; - std::string confirmationMessage() const override {return m_confirmationMessage;} - uint64_t minMixinCount() const override; + uint64_t amount() const override; + uint64_t dust() const override; + uint64_t fee() const override; +diff --git a/src/wallet/api/unsigned_transaction.cpp b/src/wallet/api/unsigned_transaction.cpp +index fd03e959d..7232e518f 100644 +--- a/src/wallet/api/unsigned_transaction.cpp ++++ b/src/wallet/api/unsigned_transaction.cpp +@@ -34,11 +34,13 @@ + + #include "cryptonote_basic/cryptonote_format_utils.h" + #include "cryptonote_basic/cryptonote_basic_impl.h" ++#include "cryptonote_config.h" + + #include <memory> + #include <vector> + #include <sstream> + #include <boost/format.hpp> ++#include <functional> + + #include "bc-ur/src/bc-ur.hpp" diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp index c24b4a97d..cc85398ca 100644 @@ -476,17 +505,17 @@ index 98c03b9c1..5248badb8 100644 diff --git a/src/wallet/api/wallet2_api.h b/src/wallet/api/wallet2_api.h -index 3d11929f9..faea404dc 100644 +index 3d11929f9..ee9edd68e 100644 --- a/src/wallet/api/wallet2_api.h +++ b/src/wallet/api/wallet2_api.h -@@ -165,6 +165,7 @@ struct UnsignedTransaction - */ - virtual bool sign(const std::string &signedFileName) = 0; - virtual std::string signUR(int max_fragment_length = 130) = 0; -+ virtual std::string commitTrezor(uint64_t tx_index = 0) = 0; - }; - - /** +@@ -92,6 +92,7 @@ struct PendingTransaction + // commit transaction or save to file if filename is provided. + virtual bool commit(const std::string &filename = "", bool overwrite = false) = 0; + virtual std::string commitUR(int max_fragment_length = 130) = 0; ++ virtual std::string commitTrezor(uint64_t tx_index = 0) = 0; + virtual uint64_t amount() const = 0; + virtual uint64_t dust() const = 0; + virtual uint64_t fee() const = 0; @@ -1220,6 +1221,19 @@ struct Wallet //! serialize wallet cache to JSON @@ -508,7 +537,7 @@ index 3d11929f9..faea404dc 100644 /** diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp -index a7532d7ec..7f931c4c9 100644 +index a7532d7ec..bb0ada04d 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -98,6 +98,7 @@ extern "C" @@ -519,7 +548,28 @@ index a7532d7ec..7f931c4c9 100644 } using namespace std; using namespace crypto; -@@ -16384,4 +16385,147 @@ std::pair<size_t, uint64_t> wallet2::estimate_tx_size_and_weight(bool use_rct, i +@@ -7838,6 +7839,20 @@ std::string wallet2::dump_tx_to_str(const std::vector<pending_tx> &ptx_vector) c + return std::string(UNSIGNED_TX_PREFIX) + ciphertext; + } + //---------------------------------------------------------------------------------------------------- ++void wallet2::construct_unsigned_tx_set_for_signing(const std::vector<pending_tx>& ptx_vector, unsigned_tx_set &utx) const ++{ ++ utx.txes.clear(); ++ utx.txes.reserve(ptx_vector.size()); ++ for (const auto &tx : ptx_vector) ++ utx.txes.push_back(get_construction_data_with_decrypted_short_payment_id(tx, m_account.get_device())); ++ ++ utx.new_transfers = std::make_tuple(static_cast<uint64_t>(0), static_cast<uint64_t>(0), std::vector<exported_transfer_details>()); ++ ++ transfer_container transfers_copy; ++ get_transfers(transfers_copy); ++ utx.transfers = std::make_tuple(static_cast<uint64_t>(0), static_cast<uint64_t>(transfers_copy.size()), std::move(transfers_copy)); ++} ++//---------------------------------------------------------------------------------------------------- + bool wallet2::load_unsigned_tx(const std::string &unsigned_filename, unsigned_tx_set &exported_txs) const + { + std::string s; +@@ -16384,4 +16399,147 @@ std::pair<size_t, uint64_t> wallet2::estimate_tx_size_and_weight(bool use_rct, i return std::make_pair(size, weight); } //---------------------------------------------------------------------------------------------------- @@ -668,10 +718,19 @@ index a7532d7ec..7f931c4c9 100644 +//---------------------------------------------------------------------------------------------------- } diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h -index 37a2447d2..e2016945b 100644 +index 37a2447d2..a1ca49e90 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h -@@ -1717,7 +1717,8 @@ private: +@@ -1207,6 +1207,8 @@ private: + void commit_tx(std::vector<pending_tx>& ptx_vector); + bool save_tx(const std::vector<pending_tx>& ptx_vector, const std::string &filename) const; + std::string dump_tx_to_str(const std::vector<pending_tx> &ptx_vector) const; ++ //! Populate \p utx from pending txs for cold/device signing (uses live transfer indices). ++ void construct_unsigned_tx_set_for_signing(const std::vector<pending_tx>& ptx_vector, unsigned_tx_set &utx) const; + std::string save_multisig_tx(multisig_tx_set txs); + bool save_multisig_tx(const multisig_tx_set &txs, const std::string &filename); + std::string save_multisig_tx(const std::vector<pending_tx>& ptx_vector); +@@ -1717,7 +1719,8 @@ private: bool is_unattended() const { return m_unattended; } std::pair<size_t, uint64_t> estimate_tx_size_and_weight(bool use_rct, int n_inputs, int ring_size, int n_outputs, size_t extra_size); @@ -682,5 +741,5 @@ index 37a2447d2..e2016945b 100644 bool daemon_requires_payment(); bool make_rpc_payment(uint32_t nonce, uint32_t cookie, uint64_t &credits, uint64_t &balance); -- -2.50.1 (Apple Git-155) +2.51.0 |
