updateAddressUsage method

  1. @override
Future<void> updateAddressUsage(
  1. String walletId,
  2. String address, {
  3. DateTime? usedAt,
  4. BigInt? balanceDelta,
})
override

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);
}