Skip to content
Snippets Groups Projects
Commit 2d870c1f authored by vjrj's avatar vjrj
Browse files

Improve utxo cubit

parent c574a7e4
No related branches found
No related tags found
No related merge requests found
...@@ -57,66 +57,57 @@ class UtxoCubit extends HydratedCubit<UtxoState> { ...@@ -57,66 +57,57 @@ class UtxoCubit extends HydratedCubit<UtxoState> {
} }
} }
List<Utxo>? consume(double amount) { List<Utxo> consume(double amount) {
final List<Utxo> selectedUtxos = <Utxo>[];
double coveredAmount = 0;
final Map<String, Utxo> updatedConsumedUtxos = <String, Utxo>{};
if (state is UtxoLoaded) { if (state is UtxoLoaded) {
final UtxoLoaded currentState = state as UtxoLoaded; final UtxoLoaded currentState = state as UtxoLoaded;
for (final Utxo utxo in currentState.utxos) { final List<Utxo> selectedUtxos = <Utxo>[];
if (coveredAmount >= amount) { double total = 0.0;
break;
}
double availableAmount = utxo.amount; final List<Utxo> sortedUtxos = List<Utxo>.from(currentState.utxos)
if (currentState.consumedUtxos.containsKey(utxo.txHash)) { ..sort((Utxo a, Utxo b) => b.amount.compareTo(a.amount));
availableAmount = currentState.consumedUtxos[utxo.txHash]!.amount;
if (availableAmount == 0) {
// It's totally consumed, so skip it (but keep the record)
updatedConsumedUtxos[utxo.txHash] = utxo;
continue;
}
}
final double consumeAmount = for (final Utxo utxo in sortedUtxos) {
(amount - coveredAmount).clamp(0, availableAmount); if (total >= amount) {
coveredAmount += consumeAmount; break;
}
// Update consumed UTXOs selectedUtxos.add(utxo);
final Utxo updatedUtxo = total += utxo.amount;
currentState.consumedUtxos.containsKey(utxo.txHash)
? currentState.consumedUtxos[utxo.txHash]!
.copyWith(amount: availableAmount - consumeAmount)
: utxo.copyWith(amount: utxo.amount - consumeAmount);
updatedConsumedUtxos[utxo.txHash] = updatedUtxo;
if (consumeAmount > 0)
selectedUtxos.add(utxo.copyWith(amount: consumeAmount));
} }
if (coveredAmount < amount) { if (total < amount) {
emit(UtxosError('Insufficient UTXOs to cover the requested amount')); emit(UtxosError('Insufficient UTXOs to cover the requested amount'));
return null; return <Utxo>[];
} }
emit(currentState.copyWith( final List<Utxo> updatedUtxos = currentState.utxos
consumedUtxos: updatedConsumedUtxos, .where((Utxo utxo) => !selectedUtxos.contains(utxo))
)); .toList();
emit(currentState.copyWith(utxos: updatedUtxos));
return selectedUtxos; return selectedUtxos;
} else { } else {
emit(UtxosError('Wrong utxo state')); emit(UtxosError('Wrong utxo state'));
return null; return <Utxo>[];
} }
} }
void resetConsumedUtxos() { void resetConsumedUtxos() {
if (state is UtxoLoaded) { if (state is UtxoLoaded) {
// Emit a new state with an empty map for consumed UTXOs
emit((state as UtxoLoaded).copyWith(consumedUtxos: <String, Utxo>{})); emit((state as UtxoLoaded).copyWith(consumedUtxos: <String, Utxo>{}));
} else { } else {
emit(UtxosError('Wrong utxo state')); emit(UtxosError('Wrong utxo state'));
} }
} }
void addUtxos(List<Utxo> newUtxos) {
if (state is UtxoLoaded) {
final UtxoLoaded currentState = state as UtxoLoaded;
final List<Utxo> updatedUtxos = List<Utxo>.from(currentState.utxos)
..addAll(newUtxos);
emit(currentState.copyWith(utxos: updatedUtxos));
} else {
emit(UtxosError('Wrong utxo state'));
}
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment