mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-11-10 18:15:19 +00:00
1dffdd4387
* update migration from v0.13 to v0.14 * update dates, add rollback instructions * address review comments * update test files * add hbtc usdx incentives to migration * update genesis time * address review comments
698 lines
29 KiB
Go
698 lines
29 KiB
Go
package v0_14
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
"time"
|
|
|
|
"github.com/cosmos/cosmos-sdk/codec"
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
authexported "github.com/cosmos/cosmos-sdk/x/auth/exported"
|
|
"github.com/cosmos/cosmos-sdk/x/genutil"
|
|
"github.com/cosmos/cosmos-sdk/x/supply"
|
|
|
|
cryptoAmino "github.com/tendermint/tendermint/crypto/encoding/amino"
|
|
tmtypes "github.com/tendermint/tendermint/types"
|
|
|
|
"github.com/kava-labs/kava/app"
|
|
"github.com/kava-labs/kava/x/bep3"
|
|
v0_14cdp "github.com/kava-labs/kava/x/cdp"
|
|
v0_11cdp "github.com/kava-labs/kava/x/cdp/legacy/v0_11"
|
|
v0_14committee "github.com/kava-labs/kava/x/committee"
|
|
v0_11committee "github.com/kava-labs/kava/x/committee/legacy/v0_11"
|
|
v0_14hard "github.com/kava-labs/kava/x/hard"
|
|
v0_11hard "github.com/kava-labs/kava/x/hard/legacy/v0_11"
|
|
v0_14incentive "github.com/kava-labs/kava/x/incentive"
|
|
v0_11incentive "github.com/kava-labs/kava/x/incentive/legacy/v0_11"
|
|
"github.com/kava-labs/kava/x/kavadist"
|
|
v0_11pricefeed "github.com/kava-labs/kava/x/pricefeed"
|
|
v0_14pricefeed "github.com/kava-labs/kava/x/pricefeed"
|
|
validatorvesting "github.com/kava-labs/kava/x/validator-vesting"
|
|
)
|
|
|
|
var (
|
|
GenesisTime = time.Date(2021, 3, 24, 15, 0, 0, 0, time.UTC)
|
|
RewardEndTime = time.Date(2022, 3, 24, 14, 0, 0, 0, time.UTC)
|
|
ClaimEndTime = time.Date(2026, 3, 24, 14, 0, 0, 0, time.UTC)
|
|
)
|
|
|
|
// Migrate translates a genesis file from kava v0.11 (or v0.12) format to kava v0.13.x format.
|
|
func Migrate(genDoc tmtypes.GenesisDoc) tmtypes.GenesisDoc {
|
|
// migrate app state
|
|
var appStateMap genutil.AppMap
|
|
cdc := codec.New()
|
|
cryptoAmino.RegisterAmino(cdc)
|
|
tmtypes.RegisterEvidences(cdc)
|
|
|
|
if err := cdc.UnmarshalJSON(genDoc.AppState, &appStateMap); err != nil {
|
|
panic(err)
|
|
}
|
|
newAppState := MigrateAppState(appStateMap)
|
|
v0_14Codec := app.MakeCodec()
|
|
marshaledNewAppState, err := v0_14Codec.MarshalJSON(newAppState)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
genDoc.AppState = marshaledNewAppState
|
|
genDoc.GenesisTime = GenesisTime
|
|
genDoc.ChainID = "kava-5"
|
|
genDoc.ConsensusParams.Block.MaxGas = 20000000
|
|
return genDoc
|
|
}
|
|
|
|
// MigrateAppState migrates application state from v0.11 (or v0.12) format to a kava v0.13.x format
|
|
func MigrateAppState(v0_11AppState genutil.AppMap) genutil.AppMap {
|
|
v0_14AppState := v0_11AppState
|
|
cdc := app.MakeCodec()
|
|
var hardGenState v0_11hard.GenesisState
|
|
if v0_11AppState[v0_14hard.ModuleName] == nil {
|
|
cdc.MustUnmarshalJSON(v0_11AppState[v0_11hard.ModuleName], &hardGenState)
|
|
delete(v0_11AppState, v0_11hard.ModuleName)
|
|
v0_14AppState[v0_14hard.ModuleName] = cdc.MustMarshalJSON(
|
|
Hard(hardGenState))
|
|
}
|
|
delete(v0_14AppState, v0_11hard.ModuleName)
|
|
if v0_11AppState[v0_11cdp.ModuleName] != nil {
|
|
var cdpGenState v0_11cdp.GenesisState
|
|
cdc.MustUnmarshalJSON(v0_11AppState[v0_11cdp.ModuleName], &cdpGenState)
|
|
delete(v0_11AppState, v0_11cdp.ModuleName)
|
|
v0_14AppState[v0_14cdp.ModuleName] = cdc.MustMarshalJSON(
|
|
CDP(cdpGenState))
|
|
}
|
|
if v0_11AppState[v0_11incentive.ModuleName] != nil {
|
|
var incentiveGenState v0_11incentive.GenesisState
|
|
cdc.MustUnmarshalJSON(v0_11AppState[v0_14incentive.ModuleName], &incentiveGenState)
|
|
delete(v0_11AppState, v0_11incentive.ModuleName)
|
|
v0_14AppState[v0_14incentive.ModuleName] = cdc.MustMarshalJSON(Incentive(hardGenState, incentiveGenState))
|
|
}
|
|
if v0_11AppState[v0_11pricefeed.ModuleName] != nil {
|
|
var pricefeedGS v0_11pricefeed.GenesisState
|
|
cdc.MustUnmarshalJSON(v0_11AppState[v0_14pricefeed.ModuleName], &pricefeedGS)
|
|
delete(v0_11AppState, v0_11pricefeed.ModuleName)
|
|
v0_14AppState[v0_14pricefeed.ModuleName] = cdc.MustMarshalJSON(Pricefeed(pricefeedGS))
|
|
}
|
|
if v0_11AppState[bep3.ModuleName] != nil {
|
|
var bep3GS bep3.GenesisState
|
|
cdc.MustUnmarshalJSON(v0_11AppState[bep3.ModuleName], &bep3GS)
|
|
delete(v0_11AppState, bep3.ModuleName)
|
|
v0_14AppState[bep3.ModuleName] = cdc.MustMarshalJSON(Bep3(bep3GS))
|
|
}
|
|
if v0_11AppState[v0_11committee.ModuleName] != nil {
|
|
var committeeGS v0_11committee.GenesisState
|
|
cdc := codec.New()
|
|
sdk.RegisterCodec(cdc)
|
|
v0_11committee.RegisterCodec(cdc)
|
|
cdc.MustUnmarshalJSON(v0_11AppState[v0_11committee.ModuleName], &committeeGS)
|
|
delete(v0_11AppState, v0_11committee.ModuleName)
|
|
cdc = app.MakeCodec()
|
|
v0_14AppState[v0_14committee.ModuleName] = cdc.MustMarshalJSON(Committee(committeeGS))
|
|
}
|
|
if v0_11AppState[auth.ModuleName] != nil {
|
|
var authGS auth.GenesisState
|
|
cdc.MustUnmarshalJSON(v0_11AppState[auth.ModuleName], &authGS)
|
|
delete(v0_11AppState, auth.ModuleName)
|
|
v0_14AppState[auth.ModuleName] = cdc.MustMarshalJSON(Auth(authGS))
|
|
}
|
|
return v0_14AppState
|
|
|
|
}
|
|
|
|
// CDP migrates from a v0.11 cdp genesis state to a v0.13 cdp genesis state
|
|
func CDP(oldGenState v0_11cdp.GenesisState) v0_14cdp.GenesisState {
|
|
var newCDPs v0_14cdp.CDPs
|
|
var newDeposits v0_14cdp.Deposits
|
|
var newCollateralParams v0_14cdp.CollateralParams
|
|
var newGenesisAccumulationTimes v0_14cdp.GenesisAccumulationTimes
|
|
var previousAccumulationTime time.Time
|
|
var totalPrincipals v0_14cdp.GenesisTotalPrincipals
|
|
newStartingID := oldGenState.StartingCdpID
|
|
|
|
totalPrincipalMap := make(map[string]sdk.Int)
|
|
|
|
for _, cdp := range oldGenState.CDPs {
|
|
newCDP := v0_14cdp.NewCDPWithFees(cdp.ID, cdp.Owner, cdp.Collateral, cdp.Type, cdp.Principal, cdp.AccumulatedFees, cdp.FeesUpdated, sdk.OneDec())
|
|
if previousAccumulationTime.Before(cdp.FeesUpdated) {
|
|
previousAccumulationTime = cdp.FeesUpdated
|
|
}
|
|
_, found := totalPrincipalMap[cdp.Type]
|
|
if !found {
|
|
totalPrincipalMap[cdp.Type] = sdk.ZeroInt()
|
|
}
|
|
totalPrincipalMap[cdp.Type] = totalPrincipalMap[cdp.Type].Add(newCDP.GetTotalPrincipal().Amount)
|
|
|
|
newCDPs = append(newCDPs, newCDP)
|
|
}
|
|
|
|
for _, cp := range oldGenState.Params.CollateralParams {
|
|
newCollateralParam := v0_14cdp.NewCollateralParam(cp.Denom, cp.Type, cp.LiquidationRatio, cp.DebtLimit, cp.StabilityFee, cp.AuctionSize, cp.LiquidationPenalty, cp.Prefix, cp.SpotMarketID, cp.LiquidationMarketID, sdk.MustNewDecFromStr("0.01"), sdk.NewInt(10), cp.ConversionFactor)
|
|
newCollateralParams = append(newCollateralParams, newCollateralParam)
|
|
newGenesisAccumulationTime := v0_14cdp.NewGenesisAccumulationTime(cp.Type, previousAccumulationTime, sdk.OneDec())
|
|
newGenesisAccumulationTimes = append(newGenesisAccumulationTimes, newGenesisAccumulationTime)
|
|
}
|
|
|
|
for _, dep := range oldGenState.Deposits {
|
|
newDep := v0_14cdp.NewDeposit(dep.CdpID, dep.Depositor, dep.Amount)
|
|
newDeposits = append(newDeposits, newDep)
|
|
}
|
|
|
|
for ctype, tp := range totalPrincipalMap {
|
|
totalPrincipal := v0_14cdp.NewGenesisTotalPrincipal(ctype, tp)
|
|
totalPrincipals = append(totalPrincipals, totalPrincipal)
|
|
}
|
|
|
|
sort.Slice(totalPrincipals, func(i, j int) bool { return totalPrincipals[i].CollateralType < totalPrincipals[j].CollateralType })
|
|
|
|
oldDebtParam := oldGenState.Params.DebtParam
|
|
|
|
newDebtParam := v0_14cdp.NewDebtParam(oldDebtParam.Denom, oldDebtParam.ReferenceAsset, oldDebtParam.ConversionFactor, oldDebtParam.DebtFloor)
|
|
|
|
newGlobalDebtLimit := oldGenState.Params.GlobalDebtLimit
|
|
|
|
newParams := v0_14cdp.NewParams(newGlobalDebtLimit, newCollateralParams, newDebtParam, oldGenState.Params.SurplusAuctionThreshold, oldGenState.Params.SurplusAuctionLot, oldGenState.Params.DebtAuctionThreshold, oldGenState.Params.DebtAuctionLot, false)
|
|
|
|
return v0_14cdp.NewGenesisState(
|
|
newParams,
|
|
newCDPs,
|
|
newDeposits,
|
|
newStartingID,
|
|
oldGenState.DebtDenom,
|
|
oldGenState.GovDenom,
|
|
newGenesisAccumulationTimes,
|
|
totalPrincipals,
|
|
)
|
|
}
|
|
|
|
// Hard migrates from a v0.11 hard (harvest) genesis state to a v0.13 hard genesis state
|
|
func Hard(genesisState v0_11hard.GenesisState) v0_14hard.GenesisState {
|
|
v13Deposits := v0_14hard.Deposits{}
|
|
v13DepositorMap := make(map[string]v0_14hard.Deposit)
|
|
v13GenesisAccumulationTimes := v0_14hard.GenesisAccumulationTimes{}
|
|
v13TotalSupplied := sdk.NewCoins()
|
|
|
|
for _, dep := range genesisState.Deposits {
|
|
v13Deposit, ok := v13DepositorMap[dep.Depositor.String()]
|
|
if !ok {
|
|
v13Deposit := v0_14hard.NewDeposit(dep.Depositor, sdk.NewCoins(dep.Amount), v0_14hard.SupplyInterestFactors{v0_14hard.NewSupplyInterestFactor(dep.Amount.Denom, sdk.OneDec())})
|
|
v13DepositorMap[dep.Depositor.String()] = v13Deposit
|
|
} else {
|
|
v13Deposit.Amount = v13Deposit.Amount.Add(dep.Amount)
|
|
v13Deposit.Index = append(v13Deposit.Index, v0_14hard.NewSupplyInterestFactor(dep.Amount.Denom, sdk.OneDec()))
|
|
v13DepositorMap[dep.Depositor.String()] = v13Deposit
|
|
}
|
|
}
|
|
|
|
defaultInterestModel := v0_14hard.NewInterestRateModel(sdk.ZeroDec(), sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("1.0"))
|
|
newParams := v0_14hard.NewParams(
|
|
v0_14hard.MoneyMarkets{
|
|
|
|
v0_14hard.NewMoneyMarket("btcb", v0_14hard.NewBorrowLimit(true, sdk.ZeroDec(), sdk.MustNewDecFromStr("0.5")), "btc:usd", sdk.NewInt(100000000),
|
|
defaultInterestModel,
|
|
sdk.MustNewDecFromStr("0.025"), sdk.MustNewDecFromStr("0.02"),
|
|
),
|
|
// bnb
|
|
v0_14hard.NewMoneyMarket("bnb", v0_14hard.NewBorrowLimit(true, sdk.ZeroDec(), sdk.MustNewDecFromStr("0.5")), "bnb:usd", sdk.NewInt(100000000),
|
|
defaultInterestModel,
|
|
sdk.MustNewDecFromStr("0.025"), sdk.MustNewDecFromStr("0.02"),
|
|
),
|
|
// xrpb
|
|
v0_14hard.NewMoneyMarket("xrpb", v0_14hard.NewBorrowLimit(true, sdk.ZeroDec(), sdk.MustNewDecFromStr("0.5")), "xrp:usd", sdk.NewInt(100000000),
|
|
defaultInterestModel,
|
|
sdk.MustNewDecFromStr("0.025"), sdk.MustNewDecFromStr("0.02"),
|
|
),
|
|
// busd
|
|
v0_14hard.NewMoneyMarket("busd", v0_14hard.NewBorrowLimit(true, sdk.MustNewDecFromStr("100000000000000"), sdk.MustNewDecFromStr("0.5")), "busd:usd", sdk.NewInt(100000000),
|
|
defaultInterestModel,
|
|
sdk.MustNewDecFromStr("0.025"), sdk.MustNewDecFromStr("0.02"),
|
|
),
|
|
// usdx
|
|
v0_14hard.NewMoneyMarket("usdx", v0_14hard.NewBorrowLimit(true, sdk.ZeroDec(), sdk.ZeroDec()), "usdx:usd", sdk.NewInt(1000000),
|
|
defaultInterestModel,
|
|
sdk.MustNewDecFromStr("0.025"), sdk.MustNewDecFromStr("0.02"),
|
|
),
|
|
// ukava
|
|
v0_14hard.NewMoneyMarket("ukava", v0_14hard.NewBorrowLimit(true, sdk.ZeroDec(), sdk.MustNewDecFromStr("0.5")), "kava:usd", sdk.NewInt(1000000),
|
|
defaultInterestModel,
|
|
sdk.MustNewDecFromStr("0.025"), sdk.MustNewDecFromStr("0.02"),
|
|
),
|
|
// hard
|
|
v0_14hard.NewMoneyMarket("hard", v0_14hard.NewBorrowLimit(true, sdk.ZeroDec(), sdk.MustNewDecFromStr("0.5")), "hard:usd", sdk.NewInt(1000000),
|
|
defaultInterestModel,
|
|
sdk.MustNewDecFromStr("0.025"), sdk.MustNewDecFromStr("0.02"),
|
|
),
|
|
},
|
|
sdk.MustNewDecFromStr("10.0"),
|
|
)
|
|
|
|
for _, newDep := range v13DepositorMap {
|
|
v13Deposits = append(v13Deposits, newDep)
|
|
v13TotalSupplied = v13TotalSupplied.Add(newDep.Amount...)
|
|
}
|
|
sort.Slice(v13Deposits, func(i, j int) bool {
|
|
return v13Deposits[i].Depositor.String() > v13Deposits[j].Depositor.String()
|
|
})
|
|
|
|
for _, mm := range newParams.MoneyMarkets {
|
|
genAccumulationTime := v0_14hard.NewGenesisAccumulationTime(mm.Denom, GenesisTime, sdk.OneDec(), sdk.OneDec())
|
|
v13GenesisAccumulationTimes = append(v13GenesisAccumulationTimes, genAccumulationTime)
|
|
}
|
|
|
|
return v0_14hard.NewGenesisState(newParams, v13GenesisAccumulationTimes, v13Deposits, v0_14hard.DefaultBorrows, v13TotalSupplied, v0_14hard.DefaultTotalBorrowed, v0_14hard.DefaultTotalReserves)
|
|
}
|
|
|
|
// Incentive migrates from a v0.11 incentive genesis state to a v0.13 incentive genesis state
|
|
func Incentive(hardGS v0_11hard.GenesisState, incentiveGS v0_11incentive.GenesisState) v0_14incentive.GenesisState {
|
|
usdxMintingRewardPeriods := v0_14incentive.RewardPeriods{}
|
|
usdxRewardsPerSecondMap := make(map[string]sdk.Coin)
|
|
usdxRewardsPerSecondMap["bnb-a"] = sdk.NewCoin("ukava", sdk.NewInt(122354))
|
|
usdxRewardsPerSecondMap["btcb-a"] = sdk.NewCoin("ukava", sdk.NewInt(110780))
|
|
usdxRewardsPerSecondMap["busd-a"] = sdk.NewCoin("ukava", sdk.NewInt(30588))
|
|
usdxRewardsPerSecondMap["hard-a"] = sdk.NewCoin("ukava", sdk.NewInt(23809))
|
|
usdxRewardsPerSecondMap["ukava-a"] = sdk.NewCoin("ukava", sdk.NewInt(31746))
|
|
usdxRewardsPerSecondMap["xrpb-a"] = sdk.NewCoin("ukava", sdk.NewInt(31746))
|
|
usdxRewardsPerSecondMap["hbtc-a"] = sdk.NewCoin("ukava", sdk.NewInt(79365))
|
|
|
|
for _, rp := range incentiveGS.RewardPeriods {
|
|
rewardsPerSecond, ok := usdxRewardsPerSecondMap[rp.CollateralType]
|
|
if !ok {
|
|
panic(fmt.Sprintf("No rewards per second for collateral type: %s\n", rp.CollateralType))
|
|
}
|
|
newRP := v0_14incentive.NewRewardPeriod(true, rp.CollateralType, GenesisTime, RewardEndTime, rewardsPerSecond)
|
|
usdxMintingRewardPeriods = append(usdxMintingRewardPeriods, newRP)
|
|
}
|
|
|
|
hardSupplyRewardPeriods := v0_14incentive.MultiRewardPeriods{}
|
|
for _, rp := range hardGS.Params.LiquidityProviderSchedules {
|
|
newRP := v0_14incentive.NewMultiRewardPeriod(true, rp.DepositDenom, rp.Start, rp.End, sdk.NewCoins(rp.RewardsPerSecond))
|
|
hardSupplyRewardPeriods = append(hardSupplyRewardPeriods, newRP)
|
|
}
|
|
hardBorrowRewardPeriods := v0_14incentive.MultiRewardPeriods{}
|
|
hardDelegatorRewardPeriods := v0_14incentive.RewardPeriods{}
|
|
for _, rp := range hardGS.Params.DelegatorDistributionSchedules {
|
|
newRP := v0_14incentive.NewRewardPeriod(rp.DistributionSchedule.Active, rp.DistributionSchedule.DepositDenom, rp.DistributionSchedule.Start, rp.DistributionSchedule.End, rp.DistributionSchedule.RewardsPerSecond)
|
|
hardDelegatorRewardPeriods = append(hardDelegatorRewardPeriods, newRP)
|
|
}
|
|
params := v0_14incentive.NewParams(usdxMintingRewardPeriods, hardSupplyRewardPeriods, hardBorrowRewardPeriods, hardDelegatorRewardPeriods, v0_14incentive.Multipliers{v0_14incentive.NewMultiplier(v0_14incentive.Small, 1, sdk.MustNewDecFromStr("0.2")), v0_14incentive.NewMultiplier(v0_14incentive.Large, 12, sdk.MustNewDecFromStr("1.0"))}, ClaimEndTime)
|
|
|
|
usdxGenAccumulationTimes := v0_14incentive.GenesisAccumulationTimes{}
|
|
|
|
for _, rp := range params.USDXMintingRewardPeriods {
|
|
gat := v0_14incentive.NewGenesisAccumulationTime(rp.CollateralType, GenesisTime)
|
|
usdxGenAccumulationTimes = append(usdxGenAccumulationTimes, gat)
|
|
}
|
|
hardSupplyGenAccumulationTimes := v0_14incentive.GenesisAccumulationTimes{}
|
|
for _, rp := range params.HardSupplyRewardPeriods {
|
|
gat := v0_14incentive.NewGenesisAccumulationTime(rp.CollateralType, GenesisTime)
|
|
hardSupplyGenAccumulationTimes = append(hardSupplyGenAccumulationTimes, gat)
|
|
}
|
|
hardBorrowGenAccumulationTimes := v0_14incentive.GenesisAccumulationTimes{}
|
|
for _, rp := range params.HardBorrowRewardPeriods {
|
|
gat := v0_14incentive.NewGenesisAccumulationTime(rp.CollateralType, GenesisTime)
|
|
hardBorrowGenAccumulationTimes = append(hardBorrowGenAccumulationTimes, gat)
|
|
}
|
|
|
|
hardDelegatorGenAccumulationTimes := v0_14incentive.GenesisAccumulationTimes{}
|
|
|
|
for _, rp := range params.HardDelegatorRewardPeriods {
|
|
gat := v0_14incentive.NewGenesisAccumulationTime(rp.CollateralType, GenesisTime)
|
|
hardDelegatorGenAccumulationTimes = append(hardDelegatorGenAccumulationTimes, gat)
|
|
}
|
|
|
|
usdxClaims := v0_14incentive.USDXMintingClaims{}
|
|
usdxClaimMap := make(map[string]v0_14incentive.USDXMintingClaim)
|
|
claimEndMap := make(map[uint64]time.Time)
|
|
|
|
for _, cp := range incentiveGS.ClaimPeriods {
|
|
claimEndMap[cp.ID] = cp.End
|
|
}
|
|
|
|
for _, claim := range incentiveGS.Claims {
|
|
if claimEndMap[claim.ClaimPeriodID].Before(GenesisTime) {
|
|
continue
|
|
}
|
|
newClaim, ok := usdxClaimMap[claim.Owner.String()]
|
|
if !ok {
|
|
newClaim = v0_14incentive.NewUSDXMintingClaim(claim.Owner, claim.Reward, v0_14incentive.RewardIndexes{v0_14incentive.NewRewardIndex(claim.CollateralType, sdk.ZeroDec())})
|
|
} else {
|
|
newClaim.Reward = newClaim.Reward.Add(claim.Reward)
|
|
_, found := newClaim.RewardIndexes.GetRewardIndex(claim.CollateralType)
|
|
if !found {
|
|
newClaim.RewardIndexes = append(newClaim.RewardIndexes, v0_14incentive.NewRewardIndex(claim.CollateralType, sdk.ZeroDec()))
|
|
}
|
|
}
|
|
usdxClaimMap[newClaim.Owner.String()] = newClaim
|
|
}
|
|
|
|
for _, claim := range usdxClaimMap {
|
|
usdxClaims = append(usdxClaims, claim)
|
|
}
|
|
|
|
hardClaims := v0_14incentive.HardLiquidityProviderClaims{}
|
|
hardClaimMap := make(map[string]v0_14incentive.HardLiquidityProviderClaim)
|
|
|
|
for _, claim := range hardGS.Claims {
|
|
newClaim, ok := hardClaimMap[claim.Owner.String()]
|
|
if !ok {
|
|
// if claim.Type == "lp" -- hard supply
|
|
// if claim.Type == "stake" -- hard delegator
|
|
// hard barrow always empty
|
|
delegatorIndexes := v0_14incentive.RewardIndexes{}
|
|
supplyIndexes := v0_14incentive.MultiRewardIndexes{}
|
|
borrowIndexes := v0_14incentive.MultiRewardIndexes{}
|
|
if claim.Type == v0_11hard.Stake {
|
|
delegatorIndexes = v0_14incentive.RewardIndexes{v0_14incentive.NewRewardIndex(claim.DepositDenom, sdk.ZeroDec())}
|
|
}
|
|
if claim.Type == v0_11hard.LP {
|
|
supplyIndexes = v0_14incentive.MultiRewardIndexes{v0_14incentive.NewMultiRewardIndex(claim.DepositDenom, v0_14incentive.RewardIndexes{v0_14incentive.NewRewardIndex("hard", sdk.ZeroDec())})}
|
|
}
|
|
newClaim = v0_14incentive.NewHardLiquidityProviderClaim(claim.Owner, sdk.NewCoins(claim.Amount), supplyIndexes, borrowIndexes, delegatorIndexes)
|
|
} else {
|
|
newClaim.Reward = newClaim.Reward.Add(claim.Amount)
|
|
if claim.Type == v0_11hard.Stake {
|
|
newClaim.DelegatorRewardIndexes = v0_14incentive.RewardIndexes{v0_14incentive.NewRewardIndex(claim.DepositDenom, sdk.ZeroDec())}
|
|
}
|
|
if claim.Type == v0_11hard.LP {
|
|
_, found := newClaim.SupplyRewardIndexes.GetRewardIndex(claim.DepositDenom)
|
|
if !found {
|
|
newClaim.SupplyRewardIndexes = append(newClaim.SupplyRewardIndexes, v0_14incentive.NewMultiRewardIndex(claim.DepositDenom, v0_14incentive.RewardIndexes{v0_14incentive.NewRewardIndex("hard", sdk.ZeroDec())}))
|
|
}
|
|
}
|
|
}
|
|
hardClaimMap[claim.Owner.String()] = newClaim
|
|
}
|
|
|
|
for _, claim := range hardClaimMap {
|
|
hardClaims = append(hardClaims, claim)
|
|
}
|
|
|
|
sort.Slice(hardClaims, func(i, j int) bool { return hardClaims[i].Owner.String() < hardClaims[j].Owner.String() })
|
|
sort.Slice(usdxClaims, func(i, j int) bool { return usdxClaims[i].Owner.String() < usdxClaims[j].Owner.String() })
|
|
|
|
return v0_14incentive.NewGenesisState(
|
|
params,
|
|
usdxGenAccumulationTimes,
|
|
hardSupplyGenAccumulationTimes,
|
|
hardBorrowGenAccumulationTimes,
|
|
hardDelegatorGenAccumulationTimes,
|
|
usdxClaims,
|
|
hardClaims,
|
|
)
|
|
}
|
|
|
|
// Auth migrates from a v0.11 auth genesis state to a v0.13
|
|
func Auth(genesisState auth.GenesisState) auth.GenesisState {
|
|
validatorVestingChangeAddress, err := sdk.AccAddressFromBech32("kava1a3qmze57knfj29a5knqs5ptewh76v4fg23xsvn")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
validatorVestingUpdatedValAddress, err := sdk.ConsAddressFromBech32("kavavalcons1ucxhn6zh7y2zun49m36psjffrhmux7ukqxdcte")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
savingsRateMaccCoins := sdk.NewCoins()
|
|
savingsMaccAddr := supply.NewModuleAddress(v0_11cdp.SavingsRateMacc)
|
|
savingsRateMaccIndex := 0
|
|
liquidatorMaccIndex := 0
|
|
|
|
// moves hard distributions from hard module account to kavadist module account
|
|
hardDelegatorAddr := supply.NewModuleAddress(v0_11hard.DelegatorAccount)
|
|
hardDelegatorIdx := 0
|
|
hardDelegatorCoins := sdk.NewCoins()
|
|
hardLPAddr := supply.NewModuleAddress(v0_11hard.LPAccount)
|
|
hardLPIdx := 0
|
|
hardLPCoins := sdk.NewCoins()
|
|
|
|
harvestAddr := supply.NewModuleAddress(v0_11hard.ModuleAccountName)
|
|
harvestIdx := 0
|
|
|
|
kavaDistAddr := supply.NewModuleAddress(kavadist.KavaDistMacc)
|
|
kavaDistIdx := 0
|
|
|
|
for idx, acc := range genesisState.Accounts {
|
|
// reset validator vesting missed blocks to zero (due to ongoing network issues in kava-4)
|
|
vvacc, ok := acc.(*validatorvesting.ValidatorVestingAccount)
|
|
if ok {
|
|
vvacc.CurrentPeriodProgress.MissedBlocks = 0
|
|
if vvacc.GetAddress().Equals(validatorVestingChangeAddress) {
|
|
// update validator vesting validator address for shiprekt
|
|
vvacc.ValidatorAddress = validatorVestingUpdatedValAddress
|
|
}
|
|
}
|
|
if acc.GetAddress().Equals(savingsMaccAddr) {
|
|
savingsRateMaccCoins = acc.GetCoins()
|
|
savingsRateMaccIndex = idx
|
|
err := acc.SetCoins(acc.GetCoins().Sub(acc.GetCoins()))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
if acc.GetAddress().Equals(supply.NewModuleAddress(v0_14cdp.LiquidatorMacc)) {
|
|
liquidatorMaccIndex = idx
|
|
}
|
|
if acc.GetAddress().Equals(hardDelegatorAddr) {
|
|
hardDelegatorIdx = idx
|
|
hardDelegatorCoins = acc.GetCoins()
|
|
}
|
|
if acc.GetAddress().Equals(hardLPAddr) {
|
|
hardLPIdx = idx
|
|
hardLPCoins = acc.GetCoins()
|
|
}
|
|
if acc.GetAddress().Equals(kavaDistAddr) {
|
|
kavaDistIdx = idx
|
|
}
|
|
if acc.GetAddress().Equals(harvestAddr) {
|
|
harvestIdx = idx
|
|
|
|
}
|
|
}
|
|
// move remaining cdp savings to liquidator account
|
|
liquidatorAcc := genesisState.Accounts[liquidatorMaccIndex]
|
|
err = liquidatorAcc.SetCoins(liquidatorAcc.GetCoins().Add(savingsRateMaccCoins...))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
genesisState.Accounts[liquidatorMaccIndex] = liquidatorAcc
|
|
|
|
// migrate harvest account to new hard name
|
|
harvestAcc := genesisState.Accounts[harvestIdx].(*supply.ModuleAccount)
|
|
harvestAcc.Address = supply.NewModuleAddress(v0_14hard.ModuleAccountName)
|
|
harvestAcc.Name = v0_14hard.ModuleAccountName
|
|
harvestAcc.Permissions = []string{supply.Minter}
|
|
genesisState.Accounts[harvestIdx] = harvestAcc
|
|
|
|
// add hard module accounts to kavadist
|
|
kavaDistAcc := genesisState.Accounts[kavaDistIdx]
|
|
err = kavaDistAcc.SetCoins(kavaDistAcc.GetCoins().Add(hardDelegatorCoins...).Add(hardLPCoins...))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
genesisState.Accounts[kavaDistIdx] = kavaDistAcc
|
|
|
|
// reverse sort indexes of accounts to remove so that re-numbering is irrelevant
|
|
indexesToRemove := []int{savingsRateMaccIndex, hardDelegatorIdx, hardLPIdx}
|
|
sort.Slice(indexesToRemove, func(i, j int) bool { return indexesToRemove[i] > indexesToRemove[j] })
|
|
|
|
// delete hard delegator, hard lp, and savings rate module accounts
|
|
for _, idx := range indexesToRemove {
|
|
genesisState.Accounts = removeIndex(genesisState.Accounts, idx)
|
|
}
|
|
|
|
return genesisState
|
|
}
|
|
|
|
// Bep3 migrates a v0.11 bep3 genesis state to a v0.13 genesis state
|
|
func Bep3(genesisState bep3.GenesisState) bep3.GenesisState {
|
|
var newSupplies bep3.AssetSupplies
|
|
for _, supply := range genesisState.Supplies {
|
|
if supply.GetDenom() == "bnb" {
|
|
supply.CurrentSupply = supply.CurrentSupply.Sub(sdk.NewCoin("bnb", sdk.NewInt(1000000000000)))
|
|
}
|
|
newSupplies = append(newSupplies, supply)
|
|
}
|
|
var newSwaps bep3.AtomicSwaps
|
|
for _, swap := range genesisState.AtomicSwaps {
|
|
if swap.Status == bep3.Completed {
|
|
swap.ClosedBlock = 1 // reset closed block to one so completed swaps are removed from long term storage properly
|
|
}
|
|
if swap.Status == bep3.Open || swap.Status == bep3.Expired {
|
|
swap.Status = bep3.Expired // set open swaps to expired so they can be refunded after chain start
|
|
swap.ExpireHeight = 1 // set expire on first block as well to be safe
|
|
}
|
|
newSwaps = append(newSwaps, swap)
|
|
}
|
|
var newAssetParams bep3.AssetParams
|
|
for _, ap := range genesisState.Params.AssetParams {
|
|
ap.MinBlockLock = uint64(24686)
|
|
ap.MaxBlockLock = uint64(86400)
|
|
newAssetParams = append(newAssetParams, ap)
|
|
}
|
|
newParams := bep3.NewParams(newAssetParams)
|
|
return bep3.NewGenesisState(newParams, newSwaps, newSupplies, genesisState.PreviousBlockTime)
|
|
}
|
|
|
|
// Committee migrates from a v0.11 (or v0.12) committee genesis state to a v0.13 committee genesis state
|
|
func Committee(genesisState v0_11committee.GenesisState) v0_14committee.GenesisState {
|
|
committees := []v0_14committee.Committee{}
|
|
votes := []v0_14committee.Vote{}
|
|
proposals := []v0_14committee.Proposal{}
|
|
|
|
var newStabilityCommittee v0_14committee.Committee
|
|
var newSafetyCommittee v0_14committee.Committee
|
|
|
|
for _, com := range genesisState.Committees {
|
|
if com.ID == 1 {
|
|
newStabilityCommittee.Description = com.Description
|
|
newStabilityCommittee.ID = com.ID
|
|
newStabilityCommittee.Members = com.Members
|
|
newStabilityCommittee.VoteThreshold = com.VoteThreshold
|
|
newStabilityCommittee.ProposalDuration = com.ProposalDuration
|
|
var newStabilityCommitteePermissions []v0_14committee.Permission
|
|
var newStabilitySubParamPermissions v0_14committee.SubParamChangePermission
|
|
|
|
for _, perm := range com.Permissions {
|
|
subPerm, ok := perm.(v0_11committee.SubParamChangePermission)
|
|
if ok {
|
|
// update AllowedParams
|
|
var newAllowedParams v0_14committee.AllowedParams
|
|
for _, ap := range subPerm.AllowedParams {
|
|
if ap.Subspace == "harvest" {
|
|
continue
|
|
}
|
|
newAP := v0_14committee.AllowedParam(ap)
|
|
newAllowedParams = append(newAllowedParams, newAP)
|
|
}
|
|
hrdaMMAp := v0_14committee.AllowedParam{Subspace: "hard", Key: "MoneyMarkets"}
|
|
hardLimitAp := v0_14committee.AllowedParam{Subspace: "hard", Key: "MinimumBorrowUSDValue"}
|
|
newAllowedParams = append(newAllowedParams, hrdaMMAp)
|
|
newAllowedParams = append(newAllowedParams, hardLimitAp)
|
|
|
|
newStabilitySubParamPermissions.AllowedParams = newAllowedParams
|
|
|
|
// update AllowedCollateralParams
|
|
var newCollateralParams v0_14committee.AllowedCollateralParams
|
|
collateralTypes := []string{"bnb-a", "busd-a", "busd-b", "btcb-a", "xrpb-a", "ukava-a", "hard-a", "hbtc-a"}
|
|
for _, cp := range subPerm.AllowedCollateralParams {
|
|
newCP := v0_14committee.NewAllowedCollateralParam(
|
|
cp.Type,
|
|
cp.Denom,
|
|
cp.LiquidationRatio,
|
|
cp.DebtLimit,
|
|
cp.StabilityFee,
|
|
cp.AuctionSize,
|
|
cp.LiquidationPenalty,
|
|
cp.Prefix,
|
|
cp.SpotMarketID,
|
|
cp.LiquidationMarketID,
|
|
cp.ConversionFactor,
|
|
true,
|
|
true,
|
|
)
|
|
newCollateralParams = append(newCollateralParams, newCP)
|
|
}
|
|
for _, cType := range collateralTypes {
|
|
var foundCtype bool
|
|
for _, cp := range newCollateralParams {
|
|
if cType == cp.Type {
|
|
foundCtype = true
|
|
}
|
|
}
|
|
if !foundCtype {
|
|
newCP := v0_14committee.NewAllowedCollateralParam(cType, false, false, true, true, true, false, false, false, false, false, true, true)
|
|
newCollateralParams = append(newCollateralParams, newCP)
|
|
}
|
|
}
|
|
newStabilitySubParamPermissions.AllowedCollateralParams = newCollateralParams
|
|
|
|
// update AllowedDebtParam
|
|
newDP := v0_14committee.AllowedDebtParam{
|
|
Denom: subPerm.AllowedDebtParam.Denom,
|
|
ReferenceAsset: subPerm.AllowedDebtParam.ReferenceAsset,
|
|
ConversionFactor: subPerm.AllowedDebtParam.ConversionFactor,
|
|
DebtFloor: subPerm.AllowedDebtParam.DebtFloor,
|
|
}
|
|
newStabilitySubParamPermissions.AllowedDebtParam = newDP
|
|
|
|
// update AllowedAssetParams
|
|
var newAssetParams v0_14committee.AllowedAssetParams
|
|
for _, ap := range subPerm.AllowedAssetParams {
|
|
newAP := v0_14committee.AllowedAssetParam(ap)
|
|
newAssetParams = append(newAssetParams, newAP)
|
|
}
|
|
newStabilitySubParamPermissions.AllowedAssetParams = newAssetParams
|
|
|
|
// Update Allowed Markets
|
|
var newMarketParams v0_14committee.AllowedMarkets
|
|
for _, mp := range subPerm.AllowedMarkets {
|
|
newMP := v0_14committee.AllowedMarket(mp)
|
|
newMarketParams = append(newMarketParams, newMP)
|
|
}
|
|
newStabilitySubParamPermissions.AllowedMarkets = newMarketParams
|
|
|
|
// Add hard money market committee permissions
|
|
var newMoneyMarketParams v0_14committee.AllowedMoneyMarkets
|
|
hardMMDenoms := []string{"bnb", "busd", "btcb", "xrpb", "usdx", "ukava", "hard"}
|
|
for _, mmDenom := range hardMMDenoms {
|
|
newMoneyMarketParam := v0_14committee.NewAllowedMoneyMarket(mmDenom, true, false, false, true, true, true)
|
|
newMoneyMarketParams = append(newMoneyMarketParams, newMoneyMarketParam)
|
|
}
|
|
newStabilitySubParamPermissions.AllowedMoneyMarkets = newMoneyMarketParams
|
|
newStabilityCommitteePermissions = append(newStabilityCommitteePermissions, newStabilitySubParamPermissions)
|
|
}
|
|
}
|
|
newStabilityCommitteePermissions = append(newStabilityCommitteePermissions, v0_14committee.TextPermission{})
|
|
newStabilityCommittee.Permissions = newStabilityCommitteePermissions
|
|
committees = append(committees, newStabilityCommittee)
|
|
} else {
|
|
newSafetyCommittee.ID = com.ID
|
|
newSafetyCommittee.Description = com.Description
|
|
newSafetyCommittee.Members = com.Members
|
|
newSafetyCommittee.Permissions = []v0_14committee.Permission{v0_14committee.SoftwareUpgradePermission{}}
|
|
newSafetyCommittee.VoteThreshold = com.VoteThreshold
|
|
newSafetyCommittee.ProposalDuration = com.ProposalDuration
|
|
committees = append(committees, newSafetyCommittee)
|
|
}
|
|
}
|
|
|
|
for _, v := range genesisState.Votes {
|
|
votes = append(votes, v0_14committee.Vote(v))
|
|
}
|
|
|
|
for _, p := range genesisState.Proposals {
|
|
newPubProp := v0_14committee.PubProposal(p.PubProposal)
|
|
newProp := v0_14committee.NewProposal(newPubProp, p.ID, p.CommitteeID, p.Deadline)
|
|
proposals = append(proposals, newProp)
|
|
}
|
|
return v0_14committee.NewGenesisState(
|
|
genesisState.NextProposalID, committees, proposals, votes)
|
|
}
|
|
|
|
// Pricefeed migrates from a v0.11 (or v0.12) pricefeed genesis state to a v0.13 pricefeed genesis state
|
|
func Pricefeed(genesisState v0_11pricefeed.GenesisState) v0_14pricefeed.GenesisState {
|
|
newMarkets := v0_14pricefeed.Markets{}
|
|
oracles := genesisState.Params.Markets[0].Oracles
|
|
|
|
for _, m := range genesisState.Params.Markets {
|
|
newMarkets = append(newMarkets, m)
|
|
}
|
|
usdx := v0_11pricefeed.NewMarket("usdx:usd", "usdx", "usd", oracles, true)
|
|
newMarkets = append(newMarkets, usdx)
|
|
|
|
newPrices := v0_14pricefeed.PostedPrices{}
|
|
|
|
for _, p := range genesisState.PostedPrices {
|
|
if p.Expiry.After(GenesisTime) {
|
|
newPrices = append(newPrices, p)
|
|
}
|
|
}
|
|
|
|
return v0_14pricefeed.NewGenesisState(v0_14pricefeed.NewParams(newMarkets), newPrices)
|
|
}
|
|
|
|
func removeIndex(accs authexported.GenesisAccounts, index int) authexported.GenesisAccounts {
|
|
ret := make(authexported.GenesisAccounts, 0)
|
|
ret = append(ret, accs[:index]...)
|
|
newAccounts := append(ret, accs[index+1:]...)
|
|
return newAccounts
|
|
}
|