0g-chain/x/bep3/legacy/v0_16/migrate.go
Ruaridh e9a28cefd8
Reset bep3 swaps for zero height in migration (#1135)
* reinstate and expand export test

* format testdata json

* sort bep3 testdata json for easier diffing

* add more bep3 swap examples to test data

* reset swaps for zero height

* update top level migration testdata
2022-01-14 20:17:49 -07:00

143 lines
5.0 KiB
Go

package v0_16
import (
"fmt"
v015bep3 "github.com/kava-labs/kava/x/bep3/legacy/v0_15"
v016bep3 "github.com/kava-labs/kava/x/bep3/types"
)
func migrateAssetParam(param v015bep3.AssetParam) v016bep3.AssetParam {
return v016bep3.AssetParam{
Denom: param.Denom,
CoinID: int64(param.CoinID),
SupplyLimit: v016bep3.SupplyLimit{
Limit: param.SupplyLimit.Limit,
TimeLimited: param.SupplyLimit.TimeLimited,
TimePeriod: param.SupplyLimit.TimePeriod,
TimeBasedLimit: param.SupplyLimit.TimeBasedLimit,
},
Active: param.Active,
DeputyAddress: param.DeputyAddress,
FixedFee: param.FixedFee,
MinSwapAmount: param.MinSwapAmount,
MaxSwapAmount: param.MaxSwapAmount,
MinBlockLock: param.MinBlockLock,
MaxBlockLock: param.MaxBlockLock,
}
}
func migrateParams(v015params v015bep3.Params) v016bep3.Params {
assetParams := make(v016bep3.AssetParams, len(v015params.AssetParams))
for i, assetParam := range v015params.AssetParams {
assetParams[i] = migrateAssetParam(assetParam)
}
return v016bep3.Params{AssetParams: assetParams}
}
func migrateSwapStatus(status v015bep3.SwapStatus) v016bep3.SwapStatus {
switch status {
case v015bep3.NULL:
return v016bep3.SWAP_STATUS_UNSPECIFIED
case v015bep3.Open:
return v016bep3.SWAP_STATUS_OPEN
case v015bep3.Completed:
return v016bep3.SWAP_STATUS_COMPLETED
case v015bep3.Expired:
return v016bep3.SWAP_STATUS_EXPIRED
default:
panic(fmt.Errorf("'%d' is not a valid swap status", status))
}
}
func migrateSwapDirection(direction v015bep3.SwapDirection) v016bep3.SwapDirection {
switch direction {
case v015bep3.INVALID:
return v016bep3.SWAP_DIRECTION_UNSPECIFIED
case v015bep3.Incoming:
return v016bep3.SWAP_DIRECTION_INCOMING
case v015bep3.Outgoing:
return v016bep3.SWAP_DIRECTION_OUTGOING
default:
panic(fmt.Errorf("'%d' is not a valid swap direction", direction))
}
}
func migrateAtomicSwaps(oldSwaps v015bep3.AtomicSwaps) v016bep3.AtomicSwaps {
newSwaps := make(v016bep3.AtomicSwaps, len(oldSwaps))
for i, oldSwap := range oldSwaps {
swap := v016bep3.AtomicSwap{
Amount: oldSwap.Amount,
RandomNumberHash: oldSwap.RandomNumberHash,
ExpireHeight: oldSwap.ExpireHeight,
Timestamp: oldSwap.Timestamp,
Sender: oldSwap.Sender,
Recipient: oldSwap.Recipient,
SenderOtherChain: oldSwap.SenderOtherChain,
RecipientOtherChain: oldSwap.RecipientOtherChain,
ClosedBlock: oldSwap.ClosedBlock,
Status: migrateSwapStatus(oldSwap.Status),
CrossChain: oldSwap.CrossChain,
Direction: migrateSwapDirection(oldSwap.Direction),
}
swap = resetSwapForZeroHeight(swap)
newSwaps[i] = swap
}
return newSwaps
}
// resetSwapForZeroHeight updates swap expiry/close heights to work when the chain height is reset to zero.
func resetSwapForZeroHeight(swap v016bep3.AtomicSwap) v016bep3.AtomicSwap {
switch status := swap.Status; status {
case v016bep3.SWAP_STATUS_COMPLETED:
// Reset closed block to one so completed swaps are not held in long term storage too long.
swap.ClosedBlock = 1
case v016bep3.SWAP_STATUS_OPEN:
switch dir := swap.Direction; dir {
case v016bep3.SWAP_DIRECTION_INCOMING:
// Open incoming swaps can be expired safely. They haven't been claimed yet, so the outgoing swap on bnb will just timeout.
// The chain downtime cannot be accurately predicted, so it's easier to expire than to recalculate a correct expire height.
swap.ExpireHeight = 1
swap.Status = v016bep3.SWAP_STATUS_EXPIRED
case v016bep3.SWAP_DIRECTION_OUTGOING:
// Open outgoing swaps should be extended to allow enough time to claim after the chain launches.
// They cannot be expired as there could be an open/claimed bnb swap.
swap.ExpireHeight = 1 + 24686 // default timeout used when sending swaps from kava
case v016bep3.SWAP_DIRECTION_UNSPECIFIED:
default:
panic(fmt.Sprintf("unknown bep3 swap direction '%s'", dir))
}
case v016bep3.SWAP_STATUS_EXPIRED:
// Once a swap is marked expired the expire height is ignored. However reset to 1 to be sure.
swap.ExpireHeight = 1
case v016bep3.SWAP_STATUS_UNSPECIFIED:
default:
panic(fmt.Sprintf("unknown bep3 swap status '%s'", status))
}
return swap
}
func migrateSupplies(oldSupplies v015bep3.AssetSupplies) v016bep3.AssetSupplies {
newSupplies := make(v016bep3.AssetSupplies, len(oldSupplies))
for i, supply := range oldSupplies {
newSupplies[i] = v016bep3.AssetSupply{
IncomingSupply: supply.IncomingSupply,
OutgoingSupply: supply.OutgoingSupply,
CurrentSupply: supply.CurrentSupply,
TimeLimitedCurrentSupply: supply.TimeLimitedCurrentSupply,
TimeElapsed: supply.TimeElapsed,
}
}
return newSupplies
}
func Migrate(oldState v015bep3.GenesisState) *v016bep3.GenesisState {
return &v016bep3.GenesisState{
PreviousBlockTime: oldState.PreviousBlockTime,
Params: migrateParams(oldState.Params),
AtomicSwaps: migrateAtomicSwaps(oldState.AtomicSwaps),
Supplies: migrateSupplies(oldState.Supplies),
}
}