mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2025-01-09 04:09:25 +00:00
btc update utxo set
This commit is contained in:
parent
2ccf6bfc71
commit
6465faa4e1
3 changed files with 70 additions and 32 deletions
lib
|
@ -160,6 +160,28 @@ class MainDB {
|
|||
await isar.utxos.putAll(utxos);
|
||||
});
|
||||
|
||||
Future<void> updateUTXOs(String walletId, List<UTXO> utxos) async {
|
||||
await isar.writeTxn(() async {
|
||||
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();
|
||||
|
||||
if (storedUtxo != null) {
|
||||
// update
|
||||
set.remove(utxo);
|
||||
set.add(storedUtxo);
|
||||
}
|
||||
}
|
||||
|
||||
await isar.utxos.where().walletIdEqualTo(walletId).deleteAll();
|
||||
await isar.utxos.putAll(set.toList());
|
||||
});
|
||||
}
|
||||
|
||||
// transaction notes
|
||||
QueryBuilder<TransactionNote, TransactionNote, QAfterWhereClause>
|
||||
getTransactionNotes(String walletId) =>
|
||||
|
|
|
@ -4,7 +4,7 @@ import 'package:isar/isar.dart';
|
|||
|
||||
part 'utxo.g.dart';
|
||||
|
||||
@Collection(accessor: "utxos")
|
||||
@Collection(accessor: "utxos", inheritance: false)
|
||||
class UTXO {
|
||||
UTXO({
|
||||
required this.walletId,
|
||||
|
@ -84,4 +84,16 @@ class UTXO {
|
|||
"address: $address, "
|
||||
"otherData: $otherData, "
|
||||
"}";
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is UTXO &&
|
||||
other.walletId == walletId &&
|
||||
other.txid == txid &&
|
||||
other.vout == vout;
|
||||
}
|
||||
|
||||
@override
|
||||
@ignore
|
||||
int get hashCode => Object.hashAll([walletId, txid, vout]);
|
||||
}
|
||||
|
|
|
@ -1796,13 +1796,7 @@ class BitcoinWallet extends CoinServiceAPI
|
|||
}
|
||||
}
|
||||
|
||||
final currentChainHeight = await chainHeight;
|
||||
|
||||
final List<isar_models.UTXO> outputArray = [];
|
||||
int satoshiBalanceTotal = 0;
|
||||
int satoshiBalancePending = 0;
|
||||
int satoshiBalanceSpendable = 0;
|
||||
int satoshiBalanceBlocked = 0;
|
||||
|
||||
for (int i = 0; i < fetchedUtxoList.length; i++) {
|
||||
for (int j = 0; j < fetchedUtxoList[i].length; j++) {
|
||||
|
@ -1863,18 +1857,6 @@ class BitcoinWallet extends CoinServiceAPI
|
|||
address: utxoOwnerAddress,
|
||||
);
|
||||
|
||||
satoshiBalanceTotal += utxo.value;
|
||||
|
||||
if (utxo.isBlocked) {
|
||||
satoshiBalanceBlocked += utxo.value;
|
||||
} else {
|
||||
if (utxo.isConfirmed(currentChainHeight, MINIMUM_CONFIRMATIONS)) {
|
||||
satoshiBalanceSpendable += utxo.value;
|
||||
} else {
|
||||
satoshiBalancePending += utxo.value;
|
||||
}
|
||||
}
|
||||
|
||||
outputArray.add(utxo);
|
||||
}
|
||||
}
|
||||
|
@ -1882,27 +1864,49 @@ class BitcoinWallet extends CoinServiceAPI
|
|||
Logging.instance
|
||||
.log('Outputs fetched: $outputArray', level: LogLevel.Info);
|
||||
|
||||
// TODO move this out of here and into IDB
|
||||
await db.isar.writeTxn(() async {
|
||||
await db.isar.utxos.where().walletIdEqualTo(walletId).deleteAll();
|
||||
await db.isar.utxos.putAll(outputArray);
|
||||
});
|
||||
await db.updateUTXOs(walletId, outputArray);
|
||||
|
||||
// finally update balance
|
||||
_balance = Balance(
|
||||
coin: coin,
|
||||
total: satoshiBalanceTotal,
|
||||
spendable: satoshiBalanceSpendable,
|
||||
blockedTotal: satoshiBalanceBlocked,
|
||||
pendingSpendable: satoshiBalancePending,
|
||||
);
|
||||
await updateCachedBalance(_balance!);
|
||||
await _updateBalance();
|
||||
} catch (e, s) {
|
||||
Logging.instance
|
||||
.log("Output fetch unsuccessful: $e\n$s", level: LogLevel.Error);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _updateBalance() async {
|
||||
final utxos = await db.getUTXOs(walletId).findAll();
|
||||
final currentChainHeight = await chainHeight;
|
||||
|
||||
int satoshiBalanceTotal = 0;
|
||||
int satoshiBalancePending = 0;
|
||||
int satoshiBalanceSpendable = 0;
|
||||
int satoshiBalanceBlocked = 0;
|
||||
|
||||
for (final utxo in utxos) {
|
||||
satoshiBalanceTotal += utxo.value;
|
||||
|
||||
if (utxo.isBlocked) {
|
||||
satoshiBalanceBlocked += utxo.value;
|
||||
} else {
|
||||
if (utxo.isConfirmed(currentChainHeight, MINIMUM_CONFIRMATIONS)) {
|
||||
satoshiBalanceSpendable += utxo.value;
|
||||
} else {
|
||||
satoshiBalancePending += utxo.value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_balance = Balance(
|
||||
coin: coin,
|
||||
total: satoshiBalanceTotal,
|
||||
spendable: satoshiBalanceSpendable,
|
||||
blockedTotal: satoshiBalanceBlocked,
|
||||
pendingSpendable: satoshiBalancePending,
|
||||
);
|
||||
await updateCachedBalance(_balance!);
|
||||
}
|
||||
|
||||
@override
|
||||
Balance get balance => _balance ??= getCachedBalance();
|
||||
Balance? _balance;
|
||||
|
|
Loading…
Reference in a new issue