upsertAddress method
Store or update address metadata
Implementation
@override
Future<void> upsertAddress(String walletId, AddressMetadata metadata) async {
_ensureInitialized();
await _pool!.execute(
Sql.named('''
INSERT INTO addresses (
wallet_id, address, script_type, derivation_path, derivation_index,
is_change, label, purpose, first_used_at, last_used_at,
usage_count, balance, created_at, is_watched
) VALUES (
@walletId, @address, @scriptType, @derivationPath, @derivationIndex,
@isChange, @label, @purpose, @firstUsedAt, @lastUsedAt,
@usageCount, @balance, @now, @isWatched
)
ON CONFLICT (wallet_id, address) DO UPDATE SET
script_type = COALESCE(@scriptType, addresses.script_type),
derivation_path = COALESCE(@derivationPath, addresses.derivation_path),
derivation_index = COALESCE(@derivationIndex, addresses.derivation_index),
is_change = @isChange,
label = @label,
purpose = @purpose,
first_used_at = COALESCE(addresses.first_used_at, @firstUsedAt),
last_used_at = @lastUsedAt,
usage_count = @usageCount,
balance = @balance,
is_watched = @isWatched
'''),
parameters: {
'walletId': walletId,
'address': metadata.address,
'scriptType': metadata.scriptType,
'derivationPath': metadata.derivationPath,
'derivationIndex': metadata.derivationIndex,
'isChange': metadata.isChange,
'label': metadata.label,
'purpose': metadata.purpose,
'firstUsedAt': metadata.firstUsedAt,
'lastUsedAt': metadata.lastUsedAt,
'usageCount': metadata.usageCount,
'balance': metadata.balance.toInt(),
'now': DateTime.now(),
'isWatched': metadata.isWatched,
},
);
}