From d1f237ae51b78055b52bd8a0c2088f07ce4f4249 Mon Sep 17 00:00:00 2001 From: julian Date: Mon, 16 Jan 2023 16:37:00 -0600 Subject: [PATCH] explicit isar model constructors --- lib/models/isar/models/address/address.dart | 11 + lib/models/isar/models/address/address.g.dart | 32 +-- .../isar/models/blockchain_data/input.dart | 11 + .../isar/models/blockchain_data/input.g.dart | 19 +- .../isar/models/blockchain_data/output.dart | 9 + .../isar/models/blockchain_data/output.g.dart | 15 +- .../models/blockchain_data/transaction.dart | 15 ++ .../models/blockchain_data/transaction.g.dart | 34 +-- .../isar/models/blockchain_data/utxo.dart | 14 ++ .../isar/models/blockchain_data/utxo.g.dart | 25 +- lib/models/isar/models/transaction_note.dart | 6 + .../isar/models/transaction_note.g.dart | 9 +- .../coins/bitcoin/bitcoin_wallet.dart | 59 ++--- .../coins/bitcoincash/bitcoincash_wallet.dart | 161 ++++++------- lib/services/coins/coin_paynym_extension.dart | 101 ++++---- .../coins/dogecoin/dogecoin_wallet.dart | 62 ++--- .../coins/epiccash/epiccash_wallet.dart | 40 ++-- lib/services/coins/firo/firo_wallet.dart | 215 ++++++++++-------- .../coins/litecoin/litecoin_wallet.dart | 59 ++--- lib/services/coins/monero/monero_wallet.dart | 53 +++-- .../coins/namecoin/namecoin_wallet.dart | 59 ++--- .../coins/particl/particl_wallet.dart | 141 ++++++------ .../coins/wownero/wownero_wallet.dart | 53 +++-- 23 files changed, 663 insertions(+), 540 deletions(-) diff --git a/lib/models/isar/models/address/address.dart b/lib/models/isar/models/address/address.dart index 184b3eed8..f8b0195ca 100644 --- a/lib/models/isar/models/address/address.dart +++ b/lib/models/isar/models/address/address.dart @@ -11,6 +11,15 @@ class AddressException extends SWException { @Collection(accessor: "addresses") class Address extends CryptoCurrencyAddress { + Address({ + required this.walletId, + required this.value, + required this.publicKey, + required this.derivationIndex, + required this.type, + required this.subType, + }); + Id id = Isar.autoIncrement; @Index() @@ -56,6 +65,7 @@ enum AddressType { p2sh, p2wpkh, cryptonote, + mimbleWimble, nonWallet, } @@ -65,5 +75,6 @@ enum AddressSubType { paynymNotification, paynymSend, paynymReceive, + unknown, nonWallet, } diff --git a/lib/models/isar/models/address/address.g.dart b/lib/models/isar/models/address/address.g.dart index 5d237f37d..629881192 100644 --- a/lib/models/isar/models/address/address.g.dart +++ b/lib/models/isar/models/address/address.g.dart @@ -148,17 +148,17 @@ Address _addressDeserialize( List offsets, Map> allOffsets, ) { - final object = Address(); - object.derivationIndex = reader.readLong(offsets[0]); + final object = Address( + derivationIndex: reader.readLong(offsets[0]), + publicKey: reader.readByteList(offsets[1]) ?? [], + subType: _AddresssubTypeValueEnumMap[reader.readByteOrNull(offsets[2])] ?? + AddressSubType.receiving, + type: _AddresstypeValueEnumMap[reader.readByteOrNull(offsets[3])] ?? + AddressType.p2pkh, + value: reader.readString(offsets[4]), + walletId: reader.readString(offsets[5]), + ); object.id = id; - object.publicKey = reader.readByteList(offsets[1]) ?? []; - object.subType = - _AddresssubTypeValueEnumMap[reader.readByteOrNull(offsets[2])] ?? - AddressSubType.receiving; - object.type = _AddresstypeValueEnumMap[reader.readByteOrNull(offsets[3])] ?? - AddressType.p2pkh; - object.value = reader.readString(offsets[4]); - object.walletId = reader.readString(offsets[5]); return object; } @@ -194,7 +194,8 @@ const _AddresssubTypeEnumValueMap = { 'paynymNotification': 2, 'paynymSend': 3, 'paynymReceive': 4, - 'nonWallet': 5, + 'unknown': 5, + 'nonWallet': 6, }; const _AddresssubTypeValueEnumMap = { 0: AddressSubType.receiving, @@ -202,21 +203,24 @@ const _AddresssubTypeValueEnumMap = { 2: AddressSubType.paynymNotification, 3: AddressSubType.paynymSend, 4: AddressSubType.paynymReceive, - 5: AddressSubType.nonWallet, + 5: AddressSubType.unknown, + 6: AddressSubType.nonWallet, }; const _AddresstypeEnumValueMap = { 'p2pkh': 0, 'p2sh': 1, 'p2wpkh': 2, 'cryptonote': 3, - 'nonWallet': 4, + 'mimbleWimble': 4, + 'nonWallet': 5, }; const _AddresstypeValueEnumMap = { 0: AddressType.p2pkh, 1: AddressType.p2sh, 2: AddressType.p2wpkh, 3: AddressType.cryptonote, - 4: AddressType.nonWallet, + 4: AddressType.mimbleWimble, + 5: AddressType.nonWallet, }; Id _addressGetId(Address object) { diff --git a/lib/models/isar/models/blockchain_data/input.dart b/lib/models/isar/models/blockchain_data/input.dart index 0843dce36..403cd48f1 100644 --- a/lib/models/isar/models/blockchain_data/input.dart +++ b/lib/models/isar/models/blockchain_data/input.dart @@ -6,6 +6,17 @@ part 'input.g.dart'; @Collection() class Input { + Input({ + required this.walletId, + required this.txid, + required this.vout, + required this.scriptSig, + required this.scriptSigAsm, + required this.isCoinbase, + required this.sequence, + required this.innerRedeemScriptAsm, + }); + Id id = Isar.autoIncrement; @Index() diff --git a/lib/models/isar/models/blockchain_data/input.g.dart b/lib/models/isar/models/blockchain_data/input.g.dart index 1279f0a2e..499538b42 100644 --- a/lib/models/isar/models/blockchain_data/input.g.dart +++ b/lib/models/isar/models/blockchain_data/input.g.dart @@ -151,16 +151,17 @@ Input _inputDeserialize( List offsets, Map> allOffsets, ) { - final object = Input(); + final object = Input( + innerRedeemScriptAsm: reader.readStringOrNull(offsets[0]), + isCoinbase: reader.readBoolOrNull(offsets[1]), + scriptSig: reader.readStringOrNull(offsets[2]), + scriptSigAsm: reader.readStringOrNull(offsets[3]), + sequence: reader.readLongOrNull(offsets[4]), + txid: reader.readString(offsets[5]), + vout: reader.readLong(offsets[6]), + walletId: reader.readString(offsets[7]), + ); object.id = id; - object.innerRedeemScriptAsm = reader.readStringOrNull(offsets[0]); - object.isCoinbase = reader.readBoolOrNull(offsets[1]); - object.scriptSig = reader.readStringOrNull(offsets[2]); - object.scriptSigAsm = reader.readStringOrNull(offsets[3]); - object.sequence = reader.readLongOrNull(offsets[4]); - object.txid = reader.readString(offsets[5]); - object.vout = reader.readLong(offsets[6]); - object.walletId = reader.readString(offsets[7]); return object; } diff --git a/lib/models/isar/models/blockchain_data/output.dart b/lib/models/isar/models/blockchain_data/output.dart index fe289f910..1b24fc39d 100644 --- a/lib/models/isar/models/blockchain_data/output.dart +++ b/lib/models/isar/models/blockchain_data/output.dart @@ -5,6 +5,15 @@ part 'output.g.dart'; @Collection() class Output { + Output({ + required this.walletId, + required this.scriptPubKey, + required this.scriptPubKeyAsm, + required this.scriptPubKeyType, + required this.scriptPubKeyAddress, + required this.value, + }); + Id id = Isar.autoIncrement; @Index() diff --git a/lib/models/isar/models/blockchain_data/output.g.dart b/lib/models/isar/models/blockchain_data/output.g.dart index c57015253..619ae04b8 100644 --- a/lib/models/isar/models/blockchain_data/output.g.dart +++ b/lib/models/isar/models/blockchain_data/output.g.dart @@ -133,14 +133,15 @@ Output _outputDeserialize( List offsets, Map> allOffsets, ) { - final object = Output(); + final object = Output( + scriptPubKey: reader.readStringOrNull(offsets[0]), + scriptPubKeyAddress: reader.readString(offsets[1]), + scriptPubKeyAsm: reader.readStringOrNull(offsets[2]), + scriptPubKeyType: reader.readStringOrNull(offsets[3]), + value: reader.readLong(offsets[4]), + walletId: reader.readString(offsets[5]), + ); object.id = id; - object.scriptPubKey = reader.readStringOrNull(offsets[0]); - object.scriptPubKeyAddress = reader.readString(offsets[1]); - object.scriptPubKeyAsm = reader.readStringOrNull(offsets[2]); - object.scriptPubKeyType = reader.readStringOrNull(offsets[3]); - object.value = reader.readLong(offsets[4]); - object.walletId = reader.readString(offsets[5]); return object; } diff --git a/lib/models/isar/models/blockchain_data/transaction.dart b/lib/models/isar/models/blockchain_data/transaction.dart index 3c39e2fe6..c26a8b613 100644 --- a/lib/models/isar/models/blockchain_data/transaction.dart +++ b/lib/models/isar/models/blockchain_data/transaction.dart @@ -9,6 +9,21 @@ part 'transaction.g.dart'; @Collection() class Transaction { + Transaction({ + required this.walletId, + required this.txid, + required this.timestamp, + required this.type, + required this.subType, + required this.amount, + required this.fee, + required this.height, + required this.isCancelled, + required this.isLelantus, + required this.slateId, + required this.otherData, + }); + Id id = Isar.autoIncrement; @Index() diff --git a/lib/models/isar/models/blockchain_data/transaction.g.dart b/lib/models/isar/models/blockchain_data/transaction.g.dart index 12b95b5df..167b85cd5 100644 --- a/lib/models/isar/models/blockchain_data/transaction.g.dart +++ b/lib/models/isar/models/blockchain_data/transaction.g.dart @@ -208,24 +208,24 @@ Transaction _transactionDeserialize( List offsets, Map> allOffsets, ) { - final object = Transaction(); - object.amount = reader.readLong(offsets[0]); - object.fee = reader.readLong(offsets[1]); - object.height = reader.readLongOrNull(offsets[2]); + final object = Transaction( + amount: reader.readLong(offsets[0]), + fee: reader.readLong(offsets[1]), + height: reader.readLongOrNull(offsets[2]), + isCancelled: reader.readBool(offsets[3]), + isLelantus: reader.readBoolOrNull(offsets[4]), + otherData: reader.readStringOrNull(offsets[5]), + slateId: reader.readStringOrNull(offsets[6]), + subType: + _TransactionsubTypeValueEnumMap[reader.readByteOrNull(offsets[7])] ?? + TransactionSubType.none, + timestamp: reader.readLong(offsets[8]), + txid: reader.readString(offsets[9]), + type: _TransactiontypeValueEnumMap[reader.readByteOrNull(offsets[10])] ?? + TransactionType.outgoing, + walletId: reader.readString(offsets[11]), + ); object.id = id; - object.isCancelled = reader.readBool(offsets[3]); - object.isLelantus = reader.readBoolOrNull(offsets[4]); - object.otherData = reader.readStringOrNull(offsets[5]); - object.slateId = reader.readStringOrNull(offsets[6]); - object.subType = - _TransactionsubTypeValueEnumMap[reader.readByteOrNull(offsets[7])] ?? - TransactionSubType.none; - object.timestamp = reader.readLong(offsets[8]); - object.txid = reader.readString(offsets[9]); - object.type = - _TransactiontypeValueEnumMap[reader.readByteOrNull(offsets[10])] ?? - TransactionType.outgoing; - object.walletId = reader.readString(offsets[11]); return object; } diff --git a/lib/models/isar/models/blockchain_data/utxo.dart b/lib/models/isar/models/blockchain_data/utxo.dart index e89fce9d8..56f6c608f 100644 --- a/lib/models/isar/models/blockchain_data/utxo.dart +++ b/lib/models/isar/models/blockchain_data/utxo.dart @@ -6,6 +6,20 @@ part 'utxo.g.dart'; @Collection(accessor: "utxos") class UTXO { + UTXO({ + required this.walletId, + required this.txid, + required this.vout, + required this.value, + required this.name, + required this.isBlocked, + required this.blockedReason, + required this.isCoinbase, + required this.blockHash, + required this.blockHeight, + required this.blockTime, + }); + Id id = Isar.autoIncrement; @Index() diff --git a/lib/models/isar/models/blockchain_data/utxo.g.dart b/lib/models/isar/models/blockchain_data/utxo.g.dart index 24496eb88..f58f516fa 100644 --- a/lib/models/isar/models/blockchain_data/utxo.g.dart +++ b/lib/models/isar/models/blockchain_data/utxo.g.dart @@ -181,19 +181,20 @@ UTXO _uTXODeserialize( List offsets, Map> allOffsets, ) { - final object = UTXO(); - object.blockHash = reader.readStringOrNull(offsets[0]); - object.blockHeight = reader.readLongOrNull(offsets[1]); - object.blockTime = reader.readLongOrNull(offsets[2]); - object.blockedReason = reader.readStringOrNull(offsets[3]); + final object = UTXO( + blockHash: reader.readStringOrNull(offsets[0]), + blockHeight: reader.readLongOrNull(offsets[1]), + blockTime: reader.readLongOrNull(offsets[2]), + blockedReason: reader.readStringOrNull(offsets[3]), + isBlocked: reader.readBool(offsets[4]), + isCoinbase: reader.readBool(offsets[5]), + name: reader.readString(offsets[6]), + txid: reader.readString(offsets[7]), + value: reader.readLong(offsets[8]), + vout: reader.readLong(offsets[9]), + walletId: reader.readString(offsets[10]), + ); object.id = id; - object.isBlocked = reader.readBool(offsets[4]); - object.isCoinbase = reader.readBool(offsets[5]); - object.name = reader.readString(offsets[6]); - object.txid = reader.readString(offsets[7]); - object.value = reader.readLong(offsets[8]); - object.vout = reader.readLong(offsets[9]); - object.walletId = reader.readString(offsets[10]); return object; } diff --git a/lib/models/isar/models/transaction_note.dart b/lib/models/isar/models/transaction_note.dart index d383c16d2..a1e9e8d3f 100644 --- a/lib/models/isar/models/transaction_note.dart +++ b/lib/models/isar/models/transaction_note.dart @@ -4,6 +4,12 @@ part 'transaction_note.g.dart'; @Collection() class TransactionNote { + TransactionNote({ + required this.walletId, + required this.txid, + required this.value, + }); + Id id = Isar.autoIncrement; @Index() diff --git a/lib/models/isar/models/transaction_note.g.dart b/lib/models/isar/models/transaction_note.g.dart index 07db4d600..7bfe7d639 100644 --- a/lib/models/isar/models/transaction_note.g.dart +++ b/lib/models/isar/models/transaction_note.g.dart @@ -108,11 +108,12 @@ TransactionNote _transactionNoteDeserialize( List offsets, Map> allOffsets, ) { - final object = TransactionNote(); + final object = TransactionNote( + txid: reader.readString(offsets[0]), + value: reader.readString(offsets[1]), + walletId: reader.readString(offsets[2]), + ); object.id = id; - object.txid = reader.readString(offsets[0]); - object.value = reader.readString(offsets[1]); - object.walletId = reader.readString(offsets[2]); return object; } diff --git a/lib/services/coins/bitcoin/bitcoin_wallet.dart b/lib/services/coins/bitcoin/bitcoin_wallet.dart index 32b48282e..ad72e1fb9 100644 --- a/lib/services/coins/bitcoin/bitcoin_wallet.dart +++ b/lib/services/coins/bitcoin/bitcoin_wallet.dart @@ -402,14 +402,16 @@ class BitcoinWallet extends CoinServiceAPI with WalletCache, WalletDB { throw Exception("No Path type $type exists"); } - final address = isar_models.Address() - ..subType = chain == 0 + final address = isar_models.Address( + walletId: walletId, + value: addressString, + publicKey: node.publicKey, + type: addrType, + derivationIndex: index + j, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change - ..type = addrType - ..publicKey = node.publicKey - ..value = addressString - ..derivationIndex = index + j; + : isar_models.AddressSubType.change, + ); receivingNodes.addAll({ "${_id}_$j": { @@ -1507,14 +1509,16 @@ class BitcoinWallet extends CoinServiceAPI with WalletCache, WalletDB { derivePathType: derivePathType, ); - return isar_models.Address() - ..derivationIndex = index - ..value = address - ..publicKey = node.publicKey - ..type = addrType - ..subType = chain == 0 + return isar_models.Address( + walletId: walletId, + value: address, + publicKey: node.publicKey, + type: addrType, + derivationIndex: index, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change; + : isar_models.AddressSubType.change, + ); } /// Returns the latest receiving/change (external/internal) address for the wallet depending on [chain] @@ -1739,21 +1743,20 @@ class BitcoinWallet extends CoinServiceAPI with WalletCache, WalletDB { coin: coin, ); - final utxo = isar_models.UTXO(); - - utxo.txid = txn["txid"] as String; - utxo.vout = fetchedUtxoList[i][j]["tx_pos"] as int; - utxo.value = fetchedUtxoList[i][j]["value"] as int; - utxo.name = ""; - // todo check here if we should mark as blocked - utxo.isBlocked = false; - utxo.blockedReason = null; - - utxo.isCoinbase = txn["is_coinbase"] as bool? ?? false; - utxo.blockHash = txn["blockhash"] as String?; - utxo.blockHeight = fetchedUtxoList[i][j]["height"] as int?; - utxo.blockTime = txn["blocktime"] as int?; + final utxo = isar_models.UTXO( + walletId: walletId, + txid: txn["txid"] as String, + vout: fetchedUtxoList[i][j]["tx_pos"] as int, + value: fetchedUtxoList[i][j]["value"] as int, + name: "", + isBlocked: false, + blockedReason: null, + isCoinbase: txn["is_coinbase"] as bool? ?? false, + blockHash: txn["blockhash"] as String?, + blockHeight: fetchedUtxoList[i][j]["height"] as int?, + blockTime: txn["blocktime"] as int?, + ); satoshiBalanceTotal += utxo.value; diff --git a/lib/services/coins/bitcoincash/bitcoincash_wallet.dart b/lib/services/coins/bitcoincash/bitcoincash_wallet.dart index 41cbec46c..bcd0dbc19 100644 --- a/lib/services/coins/bitcoincash/bitcoincash_wallet.dart +++ b/lib/services/coins/bitcoincash/bitcoincash_wallet.dart @@ -387,15 +387,16 @@ class BitcoinCashWallet extends CoinServiceAPI with WalletCache, WalletDB { throw Exception("No Path type $type exists"); } - final address = isar_models.Address() - ..walletId = walletId - ..subType = chain == 0 + final address = isar_models.Address( + walletId: walletId, + value: addressString, + publicKey: node.publicKey, + type: addrType, + derivationIndex: index + j, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change - ..type = addrType - ..publicKey = node.publicKey - ..value = addressString - ..derivationIndex = index + j; + : isar_models.AddressSubType.change, + ); receivingNodes.addAll({ "${_id}_$j": { @@ -1424,15 +1425,16 @@ class BitcoinCashWallet extends CoinServiceAPI with WalletCache, WalletDB { derivePathType: derivePathType, ); - return isar_models.Address() - ..walletId = walletId - ..derivationIndex = index - ..value = address - ..publicKey = node.publicKey - ..type = addrType - ..subType = chain == 0 + return isar_models.Address( + walletId: walletId, + value: address, + publicKey: node.publicKey, + type: addrType, + derivationIndex: index, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change; + : isar_models.AddressSubType.change, + ); } /// Returns the latest receiving/change (external/internal) address for the wallet depending on [chain] @@ -1615,21 +1617,20 @@ class BitcoinCashWallet extends CoinServiceAPI with WalletCache, WalletDB { coin: coin, ); - final utxo = isar_models.UTXO()..walletId = walletId; - - utxo.txid = txn["txid"] as String; - utxo.vout = fetchedUtxoList[i][j]["tx_pos"] as int; - utxo.value = fetchedUtxoList[i][j]["value"] as int; - utxo.name = ""; - // todo check here if we should mark as blocked - utxo.isBlocked = false; - utxo.blockedReason = null; - - utxo.isCoinbase = txn["is_coinbase"] as bool? ?? false; - utxo.blockHash = txn["blockhash"] as String?; - utxo.blockHeight = fetchedUtxoList[i][j]["height"] as int?; - utxo.blockTime = txn["blocktime"] as int?; + final utxo = isar_models.UTXO( + walletId: walletId, + txid: txn["txid"] as String, + vout: fetchedUtxoList[i][j]["tx_pos"] as int, + value: fetchedUtxoList[i][j]["value"] as int, + name: "", + isBlocked: false, + blockedReason: null, + isCoinbase: txn["is_coinbase"] as bool? ?? false, + blockHash: txn["blockhash"] as String?, + blockHeight: fetchedUtxoList[i][j]["height"] as int?, + blockTime: txn["blocktime"] as int?, + ); satoshiBalanceTotal += utxo.value; @@ -2068,85 +2069,91 @@ class BitcoinCashWallet extends CoinServiceAPI with WalletCache, WalletDB { final fee = totalInputValue - totalOutputValue; - final tx = isar_models.Transaction()..walletId = walletId; - tx.txid = txData["txid"] as String; - tx.timestamp = txData["blocktime"] as int? ?? - (DateTime.now().millisecondsSinceEpoch ~/ 1000); - // this is the address initially used to fetch the txid isar_models.Address transactionAddress = txData["address"] as isar_models.Address; + isar_models.TransactionType type; + int amount; if (mySentFromAddresses.isNotEmpty && myReceivedOnAddresses.isNotEmpty) { // tx is sent to self - tx.type = isar_models.TransactionType.sentToSelf; - tx.amount = + type = isar_models.TransactionType.sentToSelf; + amount = amountSentFromWallet - amountReceivedInWallet - fee - changeAmount; } else if (mySentFromAddresses.isNotEmpty) { // outgoing tx - tx.type = isar_models.TransactionType.outgoing; - tx.amount = amountSentFromWallet - changeAmount - fee; + type = isar_models.TransactionType.outgoing; + amount = amountSentFromWallet - changeAmount - fee; final possible = outputAddresses.difference(myChangeReceivedOnAddresses).first; if (transactionAddress.value != possible) { - transactionAddress = isar_models.Address() - ..walletId = walletId - ..value = possible - ..derivationIndex = -1 - ..subType = AddressSubType.nonWallet - ..type = AddressType.nonWallet - ..publicKey = []; + transactionAddress = isar_models.Address( + walletId: walletId, + value: possible, + publicKey: [], + type: AddressType.nonWallet, + derivationIndex: -1, + subType: AddressSubType.nonWallet, + ); } } else { // incoming tx - tx.type = isar_models.TransactionType.incoming; - tx.amount = amountReceivedInWallet; + type = isar_models.TransactionType.incoming; + amount = amountReceivedInWallet; } - // TODO: other subtypes - tx.subType = isar_models.TransactionSubType.none; - - tx.fee = fee; + final tx = isar_models.Transaction( + walletId: walletId, + txid: txData["txid"] as String, + timestamp: txData["blocktime"] as int? ?? + (DateTime.now().millisecondsSinceEpoch ~/ 1000), + type: type, + subType: isar_models.TransactionSubType.none, + amount: amount, + fee: fee, + height: txData["height"] as int?, + isCancelled: false, + isLelantus: false, + slateId: null, + otherData: null, + ); List inputs = []; List outputs = []; for (final json in txData["vin"] as List) { bool isCoinBase = json['coinbase'] != null; - final input = isar_models.Input(); - input.txid = json['txid'] as String; - input.vout = json['vout'] as int? ?? -1; - input.scriptSig = json['scriptSig']?['hex'] as String?; - input.scriptSigAsm = json['scriptSig']?['asm'] as String?; - input.isCoinbase = - isCoinBase ? isCoinBase : json['is_coinbase'] as bool?; - input.sequence = json['sequence'] as int?; - input.innerRedeemScriptAsm = json['innerRedeemscriptAsm'] as String?; + final input = isar_models.Input( + walletId: walletId, + txid: json['txid'] as String, + vout: json['vout'] as int? ?? -1, + scriptSig: json['scriptSig']?['hex'] as String?, + scriptSigAsm: json['scriptSig']?['asm'] as String?, + isCoinbase: isCoinBase ? isCoinBase : json['is_coinbase'] as bool?, + sequence: json['sequence'] as int?, + innerRedeemScriptAsm: json['innerRedeemscriptAsm'] as String?, + ); inputs.add(input); } for (final json in txData["vout"] as List) { - final output = isar_models.Output(); - output.scriptPubKey = json['scriptPubKey']?['hex'] as String?; - output.scriptPubKeyAsm = json['scriptPubKey']?['asm'] as String?; - output.scriptPubKeyType = json['scriptPubKey']?['type'] as String?; - output.scriptPubKeyAddress = - json["scriptPubKey"]?["addresses"]?[0] as String? ?? - json['scriptPubKey']['type'] as String; - output.value = Format.decimalAmountToSatoshis( - Decimal.parse(json["value"].toString()), - coin, + final output = isar_models.Output( + walletId: walletId, + scriptPubKey: json['scriptPubKey']?['hex'] as String?, + scriptPubKeyAsm: json['scriptPubKey']?['asm'] as String?, + scriptPubKeyType: json['scriptPubKey']?['type'] as String?, + scriptPubKeyAddress: + json["scriptPubKey"]?["addresses"]?[0] as String? ?? + json['scriptPubKey']['type'] as String, + value: Format.decimalAmountToSatoshis( + Decimal.parse(json["value"].toString()), + coin, + ), ); outputs.add(output); } - tx.height = txData["height"] as int?; - - tx.isCancelled = false; - tx.slateId = null; - tx.otherData = null; - txns.add(Tuple4(tx, outputs, inputs, transactionAddress)); } diff --git a/lib/services/coins/coin_paynym_extension.dart b/lib/services/coins/coin_paynym_extension.dart index c97b57776..a5e8a07d5 100644 --- a/lib/services/coins/coin_paynym_extension.dart +++ b/lib/services/coins/coin_paynym_extension.dart @@ -667,87 +667,90 @@ Future, List, Address>> final fee = totalInputValue - totalOutputValue; - final tx = Transaction()..walletId = walletId; - tx.txid = txData["txid"] as String; - tx.timestamp = txData["blocktime"] as int? ?? - (DateTime.now().millisecondsSinceEpoch ~/ 1000); - // this is the address initially used to fetch the txid Address transactionAddress = txData["address"] as Address; + TransactionType type; + int amount; if (mySentFromAddresses.isNotEmpty && myReceivedOnAddresses.isNotEmpty) { // tx is sent to self - tx.type = TransactionType.sentToSelf; + type = TransactionType.sentToSelf; // should be 0 - tx.amount = - amountSentFromWallet - amountReceivedInWallet - fee - changeAmount; + amount = amountSentFromWallet - amountReceivedInWallet - fee - changeAmount; } else if (mySentFromAddresses.isNotEmpty) { // outgoing tx - tx.type = TransactionType.outgoing; - tx.amount = amountSentFromWallet - changeAmount - fee; + type = TransactionType.outgoing; + amount = amountSentFromWallet - changeAmount - fee; final possible = outputAddresses.difference(myChangeReceivedOnAddresses).first; if (transactionAddress.value != possible) { - transactionAddress = Address() - ..walletId = walletId - ..value = possible - ..derivationIndex = -1 - ..subType = AddressSubType.nonWallet - ..type = AddressType.nonWallet - ..publicKey = []; + transactionAddress = Address( + walletId: walletId, + value: possible, + derivationIndex: -1, + subType: AddressSubType.nonWallet, + type: AddressType.nonWallet, + publicKey: [], + ); } } else { // incoming tx - tx.type = TransactionType.incoming; - tx.amount = amountReceivedInWallet; + type = TransactionType.incoming; + amount = amountReceivedInWallet; } - // TODO: other subtypes - tx.subType = TransactionSubType.none; - - tx.fee = fee; + final tx = Transaction( + walletId: walletId, + txid: txData["txid"] as String, + timestamp: txData["blocktime"] as int? ?? + (DateTime.now().millisecondsSinceEpoch ~/ 1000), + type: type, + subType: TransactionSubType.none, + amount: amount, + fee: fee, + height: txData["height"] as int?, + isCancelled: false, + isLelantus: false, + slateId: null, + otherData: null, + ); List outs = []; List ins = []; for (final json in txData["vin"] as List) { bool isCoinBase = json['coinbase'] != null; - final input = Input()..walletId = walletId; - input.txid = json['txid'] as String; - input.vout = json['vout'] as int? ?? -1; - input.scriptSig = json['scriptSig']?['hex'] as String?; - input.scriptSigAsm = json['scriptSig']?['asm'] as String?; - input.isCoinbase = isCoinBase ? isCoinBase : json['is_coinbase'] as bool?; - input.sequence = json['sequence'] as int?; - input.innerRedeemScriptAsm = json['innerRedeemscriptAsm'] as String?; + final input = Input( + walletId: walletId, + txid: json['txid'] as String, + vout: json['vout'] as int? ?? -1, + scriptSig: json['scriptSig']?['hex'] as String?, + scriptSigAsm: json['scriptSig']?['asm'] as String?, + isCoinbase: isCoinBase ? isCoinBase : json['is_coinbase'] as bool?, + sequence: json['sequence'] as int?, + innerRedeemScriptAsm: json['innerRedeemscriptAsm'] as String?, + ); ins.add(input); } for (final json in txData["vout"] as List) { - final output = Output()..walletId = walletId; - output.scriptPubKey = json['scriptPubKey']?['hex'] as String?; - output.scriptPubKeyAsm = json['scriptPubKey']?['asm'] as String?; - output.scriptPubKeyType = json['scriptPubKey']?['type'] as String?; - output.scriptPubKeyAddress = - json["scriptPubKey"]?["addresses"]?[0] as String? ?? - json['scriptPubKey']['type'] as String; - output.value = Format.decimalAmountToSatoshis( - Decimal.parse(json["value"].toString()), - coin, + final output = Output( + walletId: walletId, + scriptPubKey: json['scriptPubKey']?['hex'] as String?, + scriptPubKeyAsm: json['scriptPubKey']?['asm'] as String?, + scriptPubKeyType: json['scriptPubKey']?['type'] as String?, + scriptPubKeyAddress: json["scriptPubKey"]?["addresses"]?[0] as String? ?? + json['scriptPubKey']['type'] as String, + value: Format.decimalAmountToSatoshis( + Decimal.parse(json["value"].toString()), + coin, + ), ); outs.add(output); } - tx.height = txData["height"] as int?; - - //TODO: change these for epic (or other coins that need it) - tx.isCancelled = false; - tx.slateId = null; - tx.otherData = null; - tx.isLelantus = null; - return Tuple4(tx, outs, ins, transactionAddress); } diff --git a/lib/services/coins/dogecoin/dogecoin_wallet.dart b/lib/services/coins/dogecoin/dogecoin_wallet.dart index 42ad7f8ff..3f93b26df 100644 --- a/lib/services/coins/dogecoin/dogecoin_wallet.dart +++ b/lib/services/coins/dogecoin/dogecoin_wallet.dart @@ -354,15 +354,16 @@ class DogecoinWallet extends CoinServiceAPI with WalletCache, WalletDB { data: PaymentData(pubkey: node.publicKey), network: network) .data .address!; - address = isar_models.Address() - ..walletId = walletId - ..subType = chain == 0 + address = isar_models.Address( + walletId: walletId, + value: addressString, + publicKey: node.publicKey, + type: isar_models.AddressType.p2pkh, + derivationIndex: index + j, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change - ..type = isar_models.AddressType.p2pkh - ..publicKey = node.publicKey - ..value = addressString - ..derivationIndex = index + j; + : isar_models.AddressSubType.change, + ); break; default: throw Exception("No Path type $type exists"); @@ -1278,16 +1279,16 @@ class DogecoinWallet extends CoinServiceAPI with WalletCache, WalletDB { wif: node.toWIF(), derivePathType: derivePathType, ); - - return isar_models.Address() - ..walletId = walletId - ..derivationIndex = index - ..value = address - ..publicKey = node.publicKey - ..type = isar_models.AddressType.p2pkh - ..subType = chain == 0 + return isar_models.Address( + walletId: walletId, + value: address, + publicKey: node.publicKey, + type: isar_models.AddressType.p2pkh, + derivationIndex: index, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change; + : isar_models.AddressSubType.change, + ); } /// Returns the latest receiving/change (external/internal) address for the wallet depending on [chain] @@ -1494,21 +1495,20 @@ class DogecoinWallet extends CoinServiceAPI with WalletCache, WalletDB { coin: coin, ); - final utxo = isar_models.UTXO()..walletId = walletId; - - utxo.txid = txn["txid"] as String; - utxo.vout = fetchedUtxoList[i][j]["tx_pos"] as int; - utxo.value = fetchedUtxoList[i][j]["value"] as int; - utxo.name = ""; - // todo check here if we should mark as blocked - utxo.isBlocked = false; - utxo.blockedReason = null; - - utxo.isCoinbase = txn["is_coinbase"] as bool? ?? false; - utxo.blockHash = txn["blockhash"] as String?; - utxo.blockHeight = fetchedUtxoList[i][j]["height"] as int?; - utxo.blockTime = txn["blocktime"] as int?; + final utxo = isar_models.UTXO( + walletId: walletId, + txid: txn["txid"] as String, + vout: fetchedUtxoList[i][j]["tx_pos"] as int, + value: fetchedUtxoList[i][j]["value"] as int, + name: "", + isBlocked: false, + blockedReason: null, + isCoinbase: txn["is_coinbase"] as bool? ?? false, + blockHash: txn["blockhash"] as String?, + blockHeight: fetchedUtxoList[i][j]["height"] as int?, + blockTime: txn["blocktime"] as int?, + ); satoshiBalanceTotal += utxo.value; diff --git a/lib/services/coins/epiccash/epiccash_wallet.dart b/lib/services/coins/epiccash/epiccash_wallet.dart index adeaf592e..bf98ddcb8 100644 --- a/lib/services/coins/epiccash/epiccash_wallet.dart +++ b/lib/services/coins/epiccash/epiccash_wallet.dart @@ -2025,30 +2025,31 @@ class EpicCashWallet extends CoinServiceAPI DateTime dt = DateTime.parse(tx["creation_ts"] as String); - final txn = isar_models.Transaction(); - txn.type = (tx["tx_type"] == "TxReceived" || - tx["tx_type"] == "TxReceivedCancelled") - ? isar_models.TransactionType.incoming - : isar_models.TransactionType.outgoing; - String? slateId = tx['tx_slate_id'] as String?; - String? address = slatesToCommits[slateId] + String address = slatesToCommits[slateId] ?[tx["tx_type"] == "TxReceived" ? "from" : "to"] as String? ?? ""; String? commitId = slatesToCommits[slateId]?['commitId'] as String?; - Logging.instance.log( - "commitId: $commitId, slateId: $slateId, id: ${tx["id"]}", - level: LogLevel.Info); - bool isCancelled = tx["tx_type"] == "TxSentCancelled" || - tx["tx_type"] == "TxReceivedCancelled"; + final txn = isar_models.Transaction( + walletId: walletId, + txid: commitId ?? tx["id"].toString(), + timestamp: (dt.millisecondsSinceEpoch ~/ 1000), + type: (tx["tx_type"] == "TxReceived" || + tx["tx_type"] == "TxReceivedCancelled") + ? isar_models.TransactionType.incoming + : isar_models.TransactionType.outgoing, + subType: isar_models.TransactionSubType.none, + amount: amt, + fee: (tx["fee"] == null) ? 0 : int.parse(tx["fee"] as String), + height: txHeight, + isCancelled: tx["tx_type"] == "TxSentCancelled" || + tx["tx_type"] == "TxReceivedCancelled", + isLelantus: false, + slateId: slateId, + otherData: tx["id"].toString(), + ); - txn.slateId = slateId; - txn.isCancelled = isCancelled; - txn.txid = commitId ?? tx["id"].toString(); - txn.timestamp = (dt.millisecondsSinceEpoch ~/ 1000); - txn.amount = amt; - txn.fee = (tx["fee"] == null) ? 0 : int.parse(tx["fee"] as String); // txn.address = // ""; // for this when you send a transaction you will just need to save in a hashmap in hive with the key being the txid, and the value being the address it was sent to. then you can look this value up right here in your hashmap. txn.address.value = await db @@ -2056,7 +2057,6 @@ class EpicCashWallet extends CoinServiceAPI .filter() .valueEqualTo(address) .findFirst(); - txn.height = txHeight; // // midSortedTx["inputSize"] = tx["num_inputs"]; @@ -2068,8 +2068,6 @@ class EpicCashWallet extends CoinServiceAPI // key id not used afaik? // midSortedTx["key_id"] = tx["parent_key_id"]; - txn.otherData = tx["id"].toString(); - // if (txHeight >= latestTxnBlockHeight) { // latestTxnBlockHeight = txHeight; // } diff --git a/lib/services/coins/firo/firo_wallet.dart b/lib/services/coins/firo/firo_wallet.dart index cb875fac1..f5f27e56e 100644 --- a/lib/services/coins/firo/firo_wallet.dart +++ b/lib/services/coins/firo/firo_wallet.dart @@ -417,20 +417,23 @@ Future> staticProcessRestore( int mintFee = tx.fee; int sharedFee = mintFee ~/ inputs.length; for (var element in inputs) { - editedTransactions[element.txid] = isar_models.Transaction() - ..txid = element.txid - ..timestamp = element.timestamp - ..type = element.type - ..amount = element.amount - ..fee = sharedFee + editedTransactions[element.txid] = isar_models.Transaction( + walletId: element.walletId, + txid: element.txid, + timestamp: element.timestamp, + type: element.type, + subType: isar_models.TransactionSubType.mint, + amount: element.amount, + fee: sharedFee, + height: element.height, + isCancelled: false, + isLelantus: true, + slateId: null, + otherData: txid, + ) ..inputs.addAll(element.inputs) ..outputs.addAll(element.outputs) - ..address.value = element.address.value - ..height = element.height - ..subType = isar_models.TransactionSubType.mint - ..otherData = txid - ..isLelantus = true - ..isCancelled = false; + ..address.value = element.address.value; } }); } @@ -2947,31 +2950,39 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive { await firoUpdateLelantusCoins(coins); // add the send transaction - final transaction = isar_models.Transaction() - ..txid = transactionInfo['txid'] as String - ..timestamp = transactionInfo['timestamp'] as int? ?? - (DateTime.now().millisecondsSinceEpoch ~/ 1000) - ..type = transactionInfo['txType'] == "Received" + final transaction = isar_models.Transaction( + walletId: walletId, + txid: transactionInfo['txid'] as String, + timestamp: transactionInfo['timestamp'] as int? ?? + (DateTime.now().millisecondsSinceEpoch ~/ 1000), + type: transactionInfo['txType'] == "Received" ? isar_models.TransactionType.incoming - : isar_models.TransactionType.outgoing - ..amount = Format.decimalAmountToSatoshis( - Decimal.parse(transactionInfo["amount"].toString()), coin) - ..fee = Format.decimalAmountToSatoshis( - Decimal.parse(transactionInfo["fees"].toString()), coin) - ..address.value = await db - .getAddresses(walletId) - .filter() - .valueEqualTo(transactionInfo["address"] as String) - .findFirst() - ..height = transactionInfo["height"] as int? - ..subType = transactionInfo["subType"] == "mint" + : isar_models.TransactionType.outgoing, + subType: transactionInfo["subType"] == "mint" ? isar_models.TransactionSubType.mint : transactionInfo["subType"] == "join" ? isar_models.TransactionSubType.join - : isar_models.TransactionSubType.none - ..otherData = transactionInfo["otherData"] as String? - ..isLelantus = true - ..isCancelled = false; + : isar_models.TransactionSubType.none, + amount: Format.decimalAmountToSatoshis( + Decimal.parse(transactionInfo["amount"].toString()), + coin, + ), + fee: Format.decimalAmountToSatoshis( + Decimal.parse(transactionInfo["fees"].toString()), + coin, + ), + height: transactionInfo["height"] as int?, + isCancelled: false, + isLelantus: true, + slateId: null, + otherData: transactionInfo["otherData"] as String?, + ); + + transaction.address.value = await db + .getAddresses(walletId) + .filter() + .valueEqualTo(transactionInfo["address"] as String) + .findFirst(); await db.putTransaction(transaction); @@ -3344,21 +3355,20 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive { coin: coin, ); - final utxo = isar_models.UTXO(); - - utxo.txid = txn["txid"] as String; - utxo.vout = fetchedUtxoList[i][j]["tx_pos"] as int; - utxo.value = fetchedUtxoList[i][j]["value"] as int; - utxo.name = ""; - // todo check here if we should mark as blocked - utxo.isBlocked = false; - utxo.blockedReason = null; - - utxo.isCoinbase = txn["is_coinbase"] as bool? ?? false; - utxo.blockHash = txn["blockhash"] as String?; - utxo.blockHeight = fetchedUtxoList[i][j]["height"] as int?; - utxo.blockTime = txn["blocktime"] as int?; + final utxo = isar_models.UTXO( + walletId: walletId, + txid: txn["txid"] as String, + vout: fetchedUtxoList[i][j]["tx_pos"] as int, + value: fetchedUtxoList[i][j]["value"] as int, + name: "", + isBlocked: false, + blockedReason: null, + isCoinbase: txn["is_coinbase"] as bool? ?? false, + blockHash: txn["blockhash"] as String?, + blockHeight: fetchedUtxoList[i][j]["height"] as int?, + blockTime: txn["blocktime"] as int?, + ); satoshiBalanceTotal += utxo.value; @@ -3507,15 +3517,17 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive { level: LogLevel.Info); return _generateAddressForChain(chain, index); } - return isar_models.Address() - ..value = derivations["$index"]['address'] as String - ..publicKey = Format.stringToUint8List( - derivations["$index"]['publicKey'] as String) - ..subType = chain == 0 + return isar_models.Address( + walletId: walletId, + value: derivations["$index"]['address'] as String, + publicKey: Format.stringToUint8List( + derivations["$index"]['publicKey'] as String), + type: isar_models.AddressType.p2pkh, + derivationIndex: index, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change - ..type = isar_models.AddressType.p2pkh - ..derivationIndex = index; + : isar_models.AddressSubType.change, + ); } else { final node = await compute( getBip32NodeWrapper, Tuple4(chain, index, mnemonic!, _network)); @@ -3524,14 +3536,16 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive { .data .address!; - return isar_models.Address() - ..value = address - ..publicKey = node.publicKey - ..subType = chain == 0 + return isar_models.Address( + walletId: walletId, + value: address, + publicKey: node.publicKey, + type: isar_models.AddressType.p2pkh, + derivationIndex: index, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change - ..type = isar_models.AddressType.p2pkh - ..derivationIndex = index; + : isar_models.AddressSubType.change, + ); } } @@ -3921,13 +3935,15 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive { int numTxs = await futureNumTxs; if (numTxs >= 1) { receivingIndex = i; - final addr = isar_models.Address() - ..value = address - ..type = isar_models.AddressType.p2pkh - ..subType = isar_models.AddressSubType.receiving - ..derivationIndex = i - ..publicKey = Format.stringToUint8List( - receiveDerivation['publicKey'] as String); + final addr = isar_models.Address( + walletId: walletId, + value: address, + publicKey: Format.stringToUint8List( + receiveDerivation['publicKey'] as String), + type: isar_models.AddressType.p2pkh, + derivationIndex: i, + subType: isar_models.AddressSubType.receiving, + ); receivingAddressArray.add(addr); } else if (numTxs == 0) { receivingGapCounter += 1; @@ -3945,13 +3961,15 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive { int numTxs = await _futureNumTxs; if (numTxs >= 1) { changeIndex = i; - final addr = isar_models.Address() - ..value = address - ..type = isar_models.AddressType.p2pkh - ..subType = isar_models.AddressSubType.change - ..derivationIndex = i - ..publicKey = Format.stringToUint8List( - changeDerivation['publicKey'] as String); + final addr = isar_models.Address( + walletId: walletId, + value: address, + publicKey: Format.stringToUint8List( + changeDerivation['publicKey'] as String), + type: isar_models.AddressType.p2pkh, + derivationIndex: i, + subType: isar_models.AddressSubType.change, + ); changeAddressArray.add(addr); } else if (numTxs == 0) { changeGapCounter += 1; @@ -4475,24 +4493,33 @@ class FiroWallet extends CoinServiceAPI with WalletCache, WalletDB, FiroHive { tx["address"] = tx["vout"][sendIndex]["scriptPubKey"]["addresses"][0]; tx["fees"] = tx["vin"][0]["nFees"]; - final txn = isar_models.Transaction() - ..isLelantus = true - ..txid = tx["txid"] as String - ..timestamp = tx["time"] as int? ?? - (DateTime.now().millisecondsSinceEpoch ~/ 1000) - ..type = isar_models.TransactionType.outgoing - ..subType = isar_models.TransactionSubType.join - ..fee = Format.decimalAmountToSatoshis( - Decimal.parse(tx["fees"].toString()), coin) - ..address.value = await db - .getAddresses(walletId) - .filter() - .valueEqualTo(tx["address"] as String) - .findFirst() - ..amount = Format.decimalAmountToSatoshis( - Decimal.parse(tx["amount"].toString()), coin) - ..isCancelled = false - ..height = tx["height"] as int?; + final txn = isar_models.Transaction( + walletId: walletId, + txid: tx["txid"] as String, + timestamp: tx["time"] as int? ?? + (DateTime.now().millisecondsSinceEpoch ~/ 1000), + type: isar_models.TransactionType.outgoing, + subType: isar_models.TransactionSubType.join, + amount: Format.decimalAmountToSatoshis( + Decimal.parse(tx["amount"].toString()), + coin, + ), + fee: Format.decimalAmountToSatoshis( + Decimal.parse(tx["fees"].toString()), + coin, + ), + height: tx["height"] as int?, + isCancelled: false, + isLelantus: true, + slateId: null, + otherData: null, + ); + + txn.address.value = await db + .getAddresses(walletId) + .filter() + .valueEqualTo(tx["address"] as String) + .findFirst(); txs.add(txn); } catch (e, s) { diff --git a/lib/services/coins/litecoin/litecoin_wallet.dart b/lib/services/coins/litecoin/litecoin_wallet.dart index 14aa517ee..8a6728f40 100644 --- a/lib/services/coins/litecoin/litecoin_wallet.dart +++ b/lib/services/coins/litecoin/litecoin_wallet.dart @@ -419,14 +419,16 @@ class LitecoinWallet extends CoinServiceAPI with WalletCache, WalletDB { throw Exception("No Path type $type exists"); } - final address = isar_models.Address() - ..subType = chain == 0 + final address = isar_models.Address( + walletId: walletId, + value: addressString, + publicKey: node.publicKey, + type: addrType, + derivationIndex: index + j, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change - ..type = addrType - ..publicKey = node.publicKey - ..value = addressString - ..derivationIndex = index + j; + : isar_models.AddressSubType.change, + ); receivingNodes.addAll({ "${_id}_$j": { @@ -1533,14 +1535,16 @@ class LitecoinWallet extends CoinServiceAPI with WalletCache, WalletDB { derivePathType: derivePathType, ); - return isar_models.Address() - ..derivationIndex = index - ..value = address - ..publicKey = node.publicKey - ..type = addrType - ..subType = chain == 0 + return isar_models.Address( + walletId: walletId, + value: address, + publicKey: node.publicKey, + type: addrType, + derivationIndex: index, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change; + : isar_models.AddressSubType.change, + ); } /// Returns the latest receiving/change (external/internal) address for the wallet depending on [chain] @@ -1728,21 +1732,20 @@ class LitecoinWallet extends CoinServiceAPI with WalletCache, WalletDB { coin: coin, ); - final utxo = isar_models.UTXO(); - - utxo.txid = txn["txid"] as String; - utxo.vout = fetchedUtxoList[i][j]["tx_pos"] as int; - utxo.value = fetchedUtxoList[i][j]["value"] as int; - utxo.name = ""; - // todo check here if we should mark as blocked - utxo.isBlocked = false; - utxo.blockedReason = null; - - utxo.isCoinbase = txn["is_coinbase"] as bool? ?? false; - utxo.blockHash = txn["blockhash"] as String?; - utxo.blockHeight = fetchedUtxoList[i][j]["height"] as int?; - utxo.blockTime = txn["blocktime"] as int?; + final utxo = isar_models.UTXO( + walletId: walletId, + txid: txn["txid"] as String, + vout: fetchedUtxoList[i][j]["tx_pos"] as int, + value: fetchedUtxoList[i][j]["value"] as int, + name: "", + isBlocked: false, + blockedReason: null, + isCoinbase: txn["is_coinbase"] as bool? ?? false, + blockHash: txn["blockhash"] as String?, + blockHeight: fetchedUtxoList[i][j]["height"] as int?, + blockTime: txn["blocktime"] as int?, + ); satoshiBalanceTotal += utxo.value; diff --git a/lib/services/coins/monero/monero_wallet.dart b/lib/services/coins/monero/monero_wallet.dart index cc936e141..0483a8eca 100644 --- a/lib/services/coins/monero/monero_wallet.dart +++ b/lib/services/coins/monero/monero_wallet.dart @@ -807,14 +807,16 @@ class MoneroWallet extends CoinServiceAPI with WalletCache, WalletDB { // String address = walletBase!.getTransactionAddress(chain, index); - return isar_models.Address() - ..derivationIndex = index - ..value = address - ..publicKey = [] - ..type = isar_models.AddressType.cryptonote - ..subType = chain == 0 + return isar_models.Address( + walletId: walletId, + derivationIndex: index, + value: address, + publicKey: [], + type: isar_models.AddressType.cryptonote, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change; + : isar_models.AddressSubType.change, + ); } Future _getFees() async { @@ -861,12 +863,8 @@ class MoneroWallet extends CoinServiceAPI with WalletCache, WalletDB { // " ${tx.value.keyIndex}", // level: LogLevel.Info); - final int txHeight = tx.value.height ?? 0; - final txn = isar_models.Transaction(); - txn.txid = tx.value.id; - txn.timestamp = (tx.value.date.millisecondsSinceEpoch ~/ 1000); - isar_models.Address? address; + isar_models.TransactionType type; if (tx.value.direction == TransactionDirection.incoming) { final addressInfo = tx.value.additionalInfo; @@ -883,25 +881,26 @@ class MoneroWallet extends CoinServiceAPI with WalletCache, WalletDB { .findFirst(); } - txn.type = isar_models.TransactionType.incoming; + type = isar_models.TransactionType.incoming; } else { // txn.address = ""; - txn.type = isar_models.TransactionType.outgoing; + type = isar_models.TransactionType.outgoing; } - txn.amount = tx.value.amount ?? 0; - - // TODO: other subtypes - txn.subType = isar_models.TransactionSubType.none; - - txn.fee = tx.value.fee ?? 0; - - txn.height = txHeight; - - txn.isCancelled = false; - txn.isLelantus = null; - txn.slateId = null; - txn.otherData = null; + final txn = isar_models.Transaction( + walletId: walletId, + txid: tx.value.id, + timestamp: (tx.value.date.millisecondsSinceEpoch ~/ 1000), + type: type, + subType: isar_models.TransactionSubType.none, + amount: tx.value.amount ?? 0, + fee: tx.value.fee ?? 0, + height: tx.value.height, + isCancelled: false, + isLelantus: false, + slateId: null, + otherData: null, + ); txnsData.add(Tuple4(txn, [], [], address)); } diff --git a/lib/services/coins/namecoin/namecoin_wallet.dart b/lib/services/coins/namecoin/namecoin_wallet.dart index b1d76f465..9e63f6502 100644 --- a/lib/services/coins/namecoin/namecoin_wallet.dart +++ b/lib/services/coins/namecoin/namecoin_wallet.dart @@ -409,14 +409,16 @@ class NamecoinWallet extends CoinServiceAPI with WalletCache, WalletDB { throw Exception("No Path type $type exists"); } - final address = isar_models.Address() - ..subType = chain == 0 + final address = isar_models.Address( + walletId: walletId, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change - ..type = addrType - ..publicKey = node.publicKey - ..value = addressString - ..derivationIndex = index + j; + : isar_models.AddressSubType.change, + type: addrType, + publicKey: node.publicKey, + value: addressString, + derivationIndex: index + j, + ); receivingNodes.addAll({ "${_id}_$j": { @@ -1510,14 +1512,16 @@ class NamecoinWallet extends CoinServiceAPI with WalletCache, WalletDB { derivePathType: derivePathType, ); - return isar_models.Address() - ..derivationIndex = index - ..value = address - ..publicKey = node.publicKey - ..type = addrType - ..subType = chain == 0 + return isar_models.Address( + walletId: walletId, + derivationIndex: index, + value: address, + publicKey: node.publicKey, + type: addrType, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change; + : isar_models.AddressSubType.change, + ); } /// Returns the latest receiving/change (external/internal) address for the wallet depending on [chain] @@ -1707,21 +1711,20 @@ class NamecoinWallet extends CoinServiceAPI with WalletCache, WalletDB { coin: coin, ); - final utxo = isar_models.UTXO(); - - utxo.txid = txn["txid"] as String; - utxo.vout = fetchedUtxoList[i][j]["tx_pos"] as int; - utxo.value = fetchedUtxoList[i][j]["value"] as int; - utxo.name = ""; - // todo check here if we should mark as blocked - utxo.isBlocked = false; - utxo.blockedReason = null; - - utxo.isCoinbase = txn["is_coinbase"] as bool? ?? false; - utxo.blockHash = txn["blockhash"] as String?; - utxo.blockHeight = fetchedUtxoList[i][j]["height"] as int?; - utxo.blockTime = txn["blocktime"] as int?; + final utxo = isar_models.UTXO( + walletId: walletId, + txid: txn["txid"] as String, + vout: fetchedUtxoList[i][j]["tx_pos"] as int, + value: fetchedUtxoList[i][j]["value"] as int, + name: "", + isBlocked: false, + blockedReason: null, + isCoinbase: txn["is_coinbase"] as bool? ?? false, + blockHash: txn["blockhash"] as String?, + blockHeight: fetchedUtxoList[i][j]["height"] as int?, + blockTime: txn["blocktime"] as int?, + ); satoshiBalanceTotal += utxo.value; diff --git a/lib/services/coins/particl/particl_wallet.dart b/lib/services/coins/particl/particl_wallet.dart index 56560712b..14edcd2dd 100644 --- a/lib/services/coins/particl/particl_wallet.dart +++ b/lib/services/coins/particl/particl_wallet.dart @@ -392,14 +392,16 @@ class ParticlWallet extends CoinServiceAPI with WalletCache, WalletDB { throw Exception("No Path type $type exists"); } - final address = isar_models.Address() - ..subType = chain == 0 + final address = isar_models.Address( + walletId: walletId, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change - ..type = addrType - ..publicKey = node.publicKey - ..value = addressString - ..derivationIndex = index + j; + : isar_models.AddressSubType.change, + type: addrType, + publicKey: node.publicKey, + value: addressString, + derivationIndex: index + j, + ); receivingNodes.addAll({ "${_id}_$j": { @@ -1407,14 +1409,16 @@ class ParticlWallet extends CoinServiceAPI with WalletCache, WalletDB { derivePathType: derivePathType, ); - return isar_models.Address() - ..derivationIndex = index - ..value = address - ..publicKey = node.publicKey - ..type = addrType - ..subType = chain == 0 + return isar_models.Address( + walletId: walletId, + derivationIndex: index, + value: address, + publicKey: node.publicKey, + type: addrType, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change; + : isar_models.AddressSubType.change, + ); } /// Returns the latest receiving/change (external/internal) address for the wallet depending on [chain] @@ -1597,21 +1601,20 @@ class ParticlWallet extends CoinServiceAPI with WalletCache, WalletDB { coin: coin, ); - final utxo = isar_models.UTXO(); - - utxo.txid = txn["txid"] as String; - utxo.vout = fetchedUtxoList[i][j]["tx_pos"] as int; - utxo.value = fetchedUtxoList[i][j]["value"] as int; - utxo.name = ""; - // todo check here if we should mark as blocked - utxo.isBlocked = false; - utxo.blockedReason = null; - - utxo.isCoinbase = txn["is_coinbase"] as bool? ?? false; - utxo.blockHash = txn["blockhash"] as String?; - utxo.blockHeight = fetchedUtxoList[i][j]["height"] as int?; - utxo.blockTime = txn["blocktime"] as int?; + final utxo = isar_models.UTXO( + walletId: walletId, + txid: txn["txid"] as String, + vout: fetchedUtxoList[i][j]["tx_pos"] as int, + value: fetchedUtxoList[i][j]["value"] as int, + name: "", + isBlocked: false, + blockedReason: null, + isCoinbase: txn["is_coinbase"] as bool? ?? false, + blockHash: txn["blockhash"] as String?, + blockHeight: fetchedUtxoList[i][j]["height"] as int?, + blockTime: txn["blocktime"] as int?, + ); satoshiBalanceTotal += utxo.value; @@ -2231,25 +2234,32 @@ class ParticlWallet extends CoinServiceAPI with WalletCache, WalletDB { midSortedTx["inputs"] = txObject["vin"]; midSortedTx["outputs"] = txObject["vout"]; - final int height = txObject["height"] as int; - // midSortedArray.add(midSortedTx); - final tx = isar_models.Transaction(); - tx.txid = midSortedTx["txid"] as String; - tx.timestamp = midSortedTx["timestamp"] as int; - + isar_models.TransactionType type; + int amount; if (foundInSenders) { - tx.type = isar_models.TransactionType.outgoing; - tx.amount = inputAmtSentFromWallet; + type = isar_models.TransactionType.outgoing; + amount = inputAmtSentFromWallet; } else { - tx.type = isar_models.TransactionType.incoming; - tx.amount = outputAmtAddressedToWallet; + type = isar_models.TransactionType.incoming; + amount = outputAmtAddressedToWallet; } - // TODO: other subtypes - tx.subType = isar_models.TransactionSubType.none; + final tx = isar_models.Transaction( + walletId: walletId, + txid: midSortedTx["txid"] as String, + timestamp: midSortedTx["timestamp"] as int, + type: type, + subType: isar_models.TransactionSubType.none, + amount: amount, + fee: fee, + height: txObject["height"] as int, + isCancelled: false, + isLelantus: false, + slateId: null, + otherData: null, + ); - tx.fee = fee; isar_models.Address? transactionAddress = midSortedTx["address"] as isar_models.Address?; @@ -2258,40 +2268,37 @@ class ParticlWallet extends CoinServiceAPI with WalletCache, WalletDB { for (final json in midSortedTx["vin"] as List) { bool isCoinBase = json['coinbase'] != null; - final input = isar_models.Input(); - input.txid = json['txid'] as String? ?? ""; - input.vout = json['vout'] as int? ?? -1; - input.scriptSig = json['scriptSig']?['hex'] as String?; - input.scriptSigAsm = json['scriptSig']?['asm'] as String?; - input.isCoinbase = - isCoinBase ? isCoinBase : json['is_coinbase'] as bool?; - input.sequence = json['sequence'] as int?; - input.innerRedeemScriptAsm = json['innerRedeemscriptAsm'] as String?; + final input = isar_models.Input( + walletId: walletId, + txid: json['txid'] as String, + vout: json['vout'] as int? ?? -1, + scriptSig: json['scriptSig']?['hex'] as String?, + scriptSigAsm: json['scriptSig']?['asm'] as String?, + isCoinbase: isCoinBase ? isCoinBase : json['is_coinbase'] as bool?, + sequence: json['sequence'] as int?, + innerRedeemScriptAsm: json['innerRedeemscriptAsm'] as String?, + ); inputs.add(input); } for (final json in midSortedTx["vout"] as List) { - final output = isar_models.Output(); - output.scriptPubKey = json['scriptPubKey']?['hex'] as String?; - output.scriptPubKeyAsm = json['scriptPubKey']?['asm'] as String?; - output.scriptPubKeyType = json['scriptPubKey']?['type'] as String?; - output.scriptPubKeyAddress = - json["scriptPubKey"]?["addresses"]?[0] as String? ?? - json['scriptPubKey']?['type'] as String? ?? - ""; - output.value = Format.decimalAmountToSatoshis( - Decimal.tryParse(json["value"].toString()) ?? Decimal.zero, - coin, + final output = isar_models.Output( + walletId: walletId, + scriptPubKey: json['scriptPubKey']?['hex'] as String?, + scriptPubKeyAsm: json['scriptPubKey']?['asm'] as String?, + scriptPubKeyType: json['scriptPubKey']?['type'] as String?, + scriptPubKeyAddress: + json["scriptPubKey"]?["addresses"]?[0] as String? ?? + json['scriptPubKey']['type'] as String? ?? + "", + value: Format.decimalAmountToSatoshis( + Decimal.parse(json["value"].toString()), + coin, + ), ); outputs.add(output); } - tx.height = height; - - tx.isCancelled = false; - tx.slateId = null; - tx.otherData = null; - txns.add(Tuple4(tx, outputs, inputs, transactionAddress)); } diff --git a/lib/services/coins/wownero/wownero_wallet.dart b/lib/services/coins/wownero/wownero_wallet.dart index cd78040d7..dc72f0c26 100644 --- a/lib/services/coins/wownero/wownero_wallet.dart +++ b/lib/services/coins/wownero/wownero_wallet.dart @@ -816,14 +816,16 @@ class WowneroWallet extends CoinServiceAPI with WalletCache, WalletDB { // String address = walletBase!.getTransactionAddress(chain, index); - return isar_models.Address() - ..derivationIndex = index - ..value = address - ..publicKey = [] - ..type = isar_models.AddressType.cryptonote - ..subType = chain == 0 + return isar_models.Address( + walletId: walletId, + derivationIndex: index, + value: address, + publicKey: [], + type: isar_models.AddressType.cryptonote, + subType: chain == 0 ? isar_models.AddressSubType.receiving - : isar_models.AddressSubType.change; + : isar_models.AddressSubType.change, + ); } Future _getFees() async { @@ -930,12 +932,8 @@ class WowneroWallet extends CoinServiceAPI with WalletCache, WalletDB { // midSortedTx["outputs"] = []; // midSortedArray.add(midSortedTx); - final int txHeight = tx.value.height ?? 0; - final txn = isar_models.Transaction(); - txn.txid = tx.value.id; - txn.timestamp = (tx.value.date.millisecondsSinceEpoch ~/ 1000); - isar_models.Address? address; + isar_models.TransactionType type; if (tx.value.direction == TransactionDirection.incoming) { final addressInfo = tx.value.additionalInfo; @@ -952,25 +950,26 @@ class WowneroWallet extends CoinServiceAPI with WalletCache, WalletDB { .findFirst(); } - txn.type = isar_models.TransactionType.incoming; + type = isar_models.TransactionType.incoming; } else { // txn.address = ""; - txn.type = isar_models.TransactionType.outgoing; + type = isar_models.TransactionType.outgoing; } - txn.amount = tx.value.amount ?? 0; - - // TODO: other subtypes - txn.subType = isar_models.TransactionSubType.none; - - txn.fee = tx.value.fee ?? 0; - - txn.height = txHeight; - - txn.isCancelled = false; - txn.isLelantus = null; - txn.slateId = null; - txn.otherData = null; + final txn = isar_models.Transaction( + walletId: walletId, + txid: tx.value.id, + timestamp: (tx.value.date.millisecondsSinceEpoch ~/ 1000), + type: type, + subType: isar_models.TransactionSubType.none, + amount: tx.value.amount ?? 0, + fee: tx.value.fee ?? 0, + height: tx.value.height, + isCancelled: false, + isLelantus: false, + slateId: null, + otherData: null, + ); txnsData.add(Tuple4(txn, [], [], address)); }