loop/staticaddr/loopin/selected_amount_migration.go
Slyghtning 2ee772b251
staticaddr: selected swap amount migration
The selected_amount column of all previous
swaps is filled with the total value of
deposits that partook in these swaps.
2025-09-25 11:13:35 +02:00

84 lines
2.2 KiB
Go

package loopin
import (
"context"
"fmt"
"time"
"github.com/btcsuite/btcd/btcutil"
"github.com/lightninglabs/loop/loopdb"
"github.com/lightninglabs/loop/staticaddr/deposit"
"github.com/lightningnetwork/lnd/lntypes"
)
const (
// selectedAmountMigrationID is the identifier for the selected swap
// amount migration.
selectedAmountMigrationID = "selected_amount"
)
// MigrateSelectedSwapAmount will update the selected swap amount of past swaps
// with the sum of the values of the deposits they swapped.
func MigrateSelectedSwapAmount(ctx context.Context, db loopdb.SwapStore,
depositStore *deposit.SqlStore, swapStore *SqlStore) error {
migrationDone, err := db.HasMigration(ctx, selectedAmountMigrationID)
if err != nil {
return fmt.Errorf("unable to check migration status: %w", err)
}
if migrationDone {
log.Infof("Selected swap amount migration already done, " +
"skipping")
return nil
}
log.Infof("Starting swap amount migration")
startTs := time.Now()
defer func() {
log.Infof("Finished swap amount migration in %v",
time.Since(startTs))
}()
// First we'll fetch all loop out swaps from the database.
swaps, err := swapStore.GetStaticAddressLoopInSwapsByStates(
ctx, FinalStates,
)
if err != nil {
return err
}
// Now we'll calculate the cost for each swap and finally update the
// costs in the database.
// TODO(hieblmi): normalize swap hash and deposit ids.
updateAmounts := make(map[lntypes.Hash]btcutil.Amount)
for _, swap := range swaps {
for _, outpoint := range swap.DepositOutpoints {
deposit, err := depositStore.DepositForOutpoint(
ctx, outpoint,
)
if err != nil {
return fmt.Errorf("unable to fetch deposit "+
"for outpoint %s: %w", outpoint, err)
}
if deposit == nil {
return fmt.Errorf("deposit for outpoint %s "+
"not found", outpoint)
}
// Set the selected amount to the value of the deposit.
updateAmounts[swap.SwapHash] += deposit.Value
}
}
log.Infof("Updating selected swap amounts for %d loop in swaps",
len(updateAmounts))
err = swapStore.BatchUpdateSelectedSwapAmounts(ctx, updateAmounts)
if err != nil {
return err
}
// Finally mark the migration as done.
return db.SetMigration(ctx, selectedAmountMigrationID)
}