2022-01-08 00:39:27 +00:00
|
|
|
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),
|
|
|
|
}
|
2022-01-15 03:17:49 +00:00
|
|
|
swap = resetSwapForZeroHeight(swap)
|
2022-01-08 00:39:27 +00:00
|
|
|
newSwaps[i] = swap
|
|
|
|
}
|
|
|
|
return newSwaps
|
|
|
|
}
|
|
|
|
|
2022-01-15 03:17:49 +00:00
|
|
|
// 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
|
|
|
|
}
|
|
|
|
|
2022-01-08 00:39:27 +00:00
|
|
|
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),
|
|
|
|
}
|
|
|
|
}
|