Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 48 additions & 48 deletions lib/db/isar/main_db.dart
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,10 @@ class MainDB {
Future<void> updateWalletInfo(WalletInfo walletInfo) async {
try {
await isar.writeTxn(() async {
final info =
await isar.walletInfo
.where()
.walletIdEqualTo(walletInfo.walletId)
.findFirst();
final info = await isar.walletInfo
.where()
.walletIdEqualTo(walletInfo.walletId)
.findFirst();
if (info == null) {
throw Exception(
"updateWalletInfo() called with new WalletInfo."
Expand Down Expand Up @@ -189,6 +188,7 @@ class MainDB {
}

Future<List<int>> putAddresses(List<Address> addresses) async {
if (addresses.isEmpty) return [];
try {
return await isar.writeTxn(() async {
return await isar.addresses.putAll(addresses);
Expand All @@ -199,6 +199,7 @@ class MainDB {
}

Future<List<int>> updateOrPutAddresses(List<Address> addresses) async {
if (addresses.isEmpty) return [];
try {
final List<int> ids = [];
await isar.writeTxn(() async {
Expand Down Expand Up @@ -269,6 +270,7 @@ class MainDB {
}

Future<List<int>> putTransactions(List<Transaction> transactions) async {
if (transactions.isEmpty) return [];
try {
return await isar.writeTxn(() async {
return await isar.transactions.putAll(transactions);
Expand Down Expand Up @@ -306,9 +308,11 @@ class MainDB {
await isar.utxos.put(utxo);
});

Future<void> putUTXOs(List<UTXO> utxos) => isar.writeTxn(() async {
await isar.utxos.putAll(utxos);
});
Future<void> putUTXOs(List<UTXO> utxos) => utxos.isEmpty
? Future.value()
: isar.writeTxn(() async {
await isar.utxos.putAll(utxos);
});

Future<bool> updateUTXOs(String walletId, List<UTXO> utxos) async {
bool newUTXO = false;
Expand All @@ -317,11 +321,10 @@ class MainDB {
final set = utxos.toSet();
for (final utxo in utxos) {
// check if utxo exists in db and update accordingly
final storedUtxo =
await isar.utxos
.where()
.txidWalletIdVoutEqualTo(utxo.txid, utxo.walletId, utxo.vout)
.findFirst();
final storedUtxo = await isar.utxos
.where()
.txidWalletIdVoutEqualTo(utxo.txid, utxo.walletId, utxo.vout)
.findFirst();

if (storedUtxo != null) {
// update
Expand Down Expand Up @@ -441,8 +444,10 @@ class MainDB {
//
Future<void> deleteWalletBlockchainData(String walletId) async {
final transactionCount = await getTransactions(walletId).count();
final transactionCountV2 =
await isar.transactionV2s.where().walletIdEqualTo(walletId).count();
final transactionCountV2 = await isar.transactionV2s
.where()
.walletIdEqualTo(walletId)
.count();
final addressCount = await getAddresses(walletId).count();
final utxoCount = await getUTXOs(walletId).count();
// final lelantusCoinCount =
Expand All @@ -453,41 +458,37 @@ class MainDB {

// transactions
for (int i = 0; i < transactionCount; i += paginateLimit) {
final txnIds =
await getTransactions(
walletId,
).offset(i).limit(paginateLimit).idProperty().findAll();
final txnIds = await getTransactions(
walletId,
).offset(i).limit(paginateLimit).idProperty().findAll();
await isar.transactions.deleteAll(txnIds);
}

// transactions V2
for (int i = 0; i < transactionCountV2; i += paginateLimit) {
final txnIds =
await isar.transactionV2s
.where()
.walletIdEqualTo(walletId)
.offset(i)
.limit(paginateLimit)
.idProperty()
.findAll();
final txnIds = await isar.transactionV2s
.where()
.walletIdEqualTo(walletId)
.offset(i)
.limit(paginateLimit)
.idProperty()
.findAll();
await isar.transactionV2s.deleteAll(txnIds);
}

// addresses
for (int i = 0; i < addressCount; i += paginateLimit) {
final addressIds =
await getAddresses(
walletId,
).offset(i).limit(paginateLimit).idProperty().findAll();
final addressIds = await getAddresses(
walletId,
).offset(i).limit(paginateLimit).idProperty().findAll();
await isar.addresses.deleteAll(addressIds);
}

// utxos
for (int i = 0; i < utxoCount; i += paginateLimit) {
final utxoIds =
await getUTXOs(
walletId,
).offset(i).limit(paginateLimit).idProperty().findAll();
final utxoIds = await getUTXOs(
walletId,
).offset(i).limit(paginateLimit).idProperty().findAll();
await isar.utxos.deleteAll(utxoIds);
}

Expand All @@ -504,10 +505,9 @@ class MainDB {
await isar.writeTxn(() async {
const paginateLimit = 50;
for (int i = 0; i < addressLabelCount; i += paginateLimit) {
final labelIds =
await getAddressLabels(
walletId,
).offset(i).limit(paginateLimit).idProperty().findAll();
final labelIds = await getAddressLabels(
walletId,
).offset(i).limit(paginateLimit).idProperty().findAll();
await isar.addressLabels.deleteAll(labelIds);
}
});
Expand All @@ -518,10 +518,9 @@ class MainDB {
await isar.writeTxn(() async {
const paginateLimit = 50;
for (int i = 0; i < noteCount; i += paginateLimit) {
final labelIds =
await getTransactionNotes(
walletId,
).offset(i).limit(paginateLimit).idProperty().findAll();
final labelIds = await getTransactionNotes(
walletId,
).offset(i).limit(paginateLimit).idProperty().findAll();
await isar.transactionNotes.deleteAll(labelIds);
}
});
Expand All @@ -531,6 +530,7 @@ class MainDB {
List<Tuple2<Transaction, Address?>> transactionsData,
String walletId,
) async {
if (transactionsData.isEmpty) return;
try {
await isar.writeTxn(() async {
for (final data in transactionsData) {
Expand Down Expand Up @@ -570,15 +570,15 @@ class MainDB {
Future<List<int>> updateOrPutTransactionV2s(
List<TransactionV2> transactions,
) async {
if (transactions.isEmpty) return [];
try {
final List<int> ids = [];
await isar.writeTxn(() async {
for (final tx in transactions) {
final storedTx =
await isar.transactionV2s
.where()
.txidWalletIdEqualTo(tx.txid, tx.walletId)
.findFirst();
final storedTx = await isar.transactionV2s
.where()
.txidWalletIdEqualTo(tx.txid, tx.walletId)
.findFirst();

Id id;
if (storedTx == null) {
Expand Down
57 changes: 44 additions & 13 deletions lib/wallets/wallet/impl/cardano_wallet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:blockchain_utils/bip/cardano/mnemonic/cardano_icarus_seed_genera
import 'package:blockchain_utils/bip/cardano/shelley/cardano_shelley.dart';
import 'package:isar_community/isar.dart';
import 'package:on_chain/ada/ada.dart';
import 'package:on_chain/ada/src/provider/exception/blockfrost_api_error.dart';
import 'package:socks5_proxy/socks.dart';
import 'package:tuple/tuple.dart';

Expand Down Expand Up @@ -418,19 +419,45 @@ class CardanoWallet extends Bip39Wallet<Cardano> {
});
}

Future<bool> _checkAddressIsFound() async {
try {
await blockfrostProvider!.request(
BlockfrostRequestSpecificAddress(
ADAAddress.fromAddress((await getCurrentReceivingAddress())!.value),
),
);
return true;
} on BlockfrostError catch (e, s) {
if (e.statusCode == 404 && e.error == "Not found") {
Logging.instance.i(
"Ada address not seen on network yet",
error: e,
stackTrace: s,
);
return false;
} else {
rethrow;
}
}
}

@override
Future<void> updateBalance() async {
try {
await updateProvider();

final addressUtxos = await blockfrostProvider!.request(
BlockfrostRequestAddressUTXOsOfAGivenAsset(
address: ADAAddress.fromAddress(
(await getCurrentReceivingAddress())!.value,
),
asset: "lovelace",
),
);
final addressExists = await _checkAddressIsFound();

final addressUtxos = addressExists
? await blockfrostProvider!.request(
BlockfrostRequestAddressUTXOsOfAGivenAsset(
address: ADAAddress.fromAddress(
(await getCurrentReceivingAddress())!.value,
),
asset: "lovelace",
),
)
: <ADAAccountUTXOResponse>[];

BigInt totalBalanceInLovelace = BigInt.parse("0");
for (final utxo in addressUtxos) {
Expand Down Expand Up @@ -498,13 +525,17 @@ class CardanoWallet extends Bip39Wallet<Cardano> {
try {
await updateProvider();

final addressExists = await _checkAddressIsFound();

final currentAddr = (await getCurrentReceivingAddress())!.value;

final txsList = await blockfrostProvider!.request(
BlockfrostRequestAddressTransactions(
ADAAddress.fromAddress(currentAddr),
),
);
final txsList = addressExists
? await blockfrostProvider!.request(
BlockfrostRequestAddressTransactions(
ADAAddress.fromAddress(currentAddr),
),
)
: <ADATransactionSummaryInfoResponse>[];

final parsedTxsList = List<Tuple2<isar.Transaction, Address>>.empty(
growable: true,
Expand Down
Loading