updateAddressUsage method
Update address usage statistics.
usedAt records a use (first/last used, usage count + 1);
balanceDelta adjusts the balance. A call with only a balance delta
(a spend) does not count as a use.
Implementation
@override
Future<void> updateAddressUsage(
String walletId,
String address, {
DateTime? usedAt,
BigInt? balanceDelta,
}) async {
_ensureInitialized();
// Only a use (usedAt) counts towards usage_count, as on Isar: the
// projection's spend path passes a balance delta alone and used to
// bump the count on every spend.
final sets = <String>[];
final params = <String, dynamic>{
'walletId': walletId,
'address': address,
};
if (usedAt != null) {
sets.add('usage_count = usage_count + 1');
sets.add('last_used_at = @usedAt');
sets.add('first_used_at = COALESCE(first_used_at, @usedAt)');
params['usedAt'] = usedAt;
}
if (balanceDelta != null) {
sets.add('balance = balance + @balanceDelta');
params['balanceDelta'] = balanceDelta.toInt();
}
if (sets.isEmpty) return;
final sql = 'UPDATE addresses SET ${sets.join(', ')} '
'WHERE wallet_id = @walletId AND address = @address';
await _pool!.execute(Sql.named(sql), parameters: params);
}