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