mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-26 00:05:18 +00:00
[R4R] incentive, hard migrations (#783)
* update v0_11 harvest genesis state * wip: hard migration * wip: incentive migration * wip: incentive migration * update incentive migration for multi-rewards * address review comments * sort slices for deterministic ordering * update interest rate model and reserves * fix: use correct conversion factor * fix: remove auction size param * remove ununsed module accounts * update incentive claim multiplier for one month rewards * address hard migration review comments * add hard test * migrate harvest mod account (#844) * migrate harvest mod account * update hard account permissions * update hard module account permissions Co-authored-by: Ruaridh <rhuairahrighairidh@users.noreply.github.com>
This commit is contained in:
parent
99fb79a1ae
commit
0865e40553
@ -102,7 +102,7 @@ var (
|
|||||||
bep3.ModuleName: {supply.Minter, supply.Burner},
|
bep3.ModuleName: {supply.Minter, supply.Burner},
|
||||||
kavadist.ModuleName: {supply.Minter},
|
kavadist.ModuleName: {supply.Minter},
|
||||||
issuance.ModuleAccountName: {supply.Minter, supply.Burner},
|
issuance.ModuleAccountName: {supply.Minter, supply.Burner},
|
||||||
hard.ModuleAccountName: {supply.Minter, supply.Burner},
|
hard.ModuleAccountName: {supply.Minter},
|
||||||
}
|
}
|
||||||
|
|
||||||
// module accounts that are allowed to receive tokens
|
// module accounts that are allowed to receive tokens
|
||||||
|
@ -652,7 +652,7 @@ func MigrateHarvest() v0_11harvest.GenesisState {
|
|||||||
time.Hour*24,
|
time.Hour*24,
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
), v0_11harvest.DefaultPreviousBlockTime, v0_11harvest.DefaultDistributionTimes)
|
), v0_11harvest.DefaultPreviousBlockTime, v0_11harvest.DefaultDistributionTimes, v0_11harvest.DefaultDeposits, v0_11harvest.DefaultClaims)
|
||||||
return harvestGS
|
return harvestGS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package v0_13
|
package v0_13
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"sort"
|
"sort"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -13,6 +14,17 @@ import (
|
|||||||
v0_11cdp "github.com/kava-labs/kava/x/cdp/legacy/v0_11"
|
v0_11cdp "github.com/kava-labs/kava/x/cdp/legacy/v0_11"
|
||||||
v0_13committee "github.com/kava-labs/kava/x/committee"
|
v0_13committee "github.com/kava-labs/kava/x/committee"
|
||||||
v0_11committee "github.com/kava-labs/kava/x/committee/legacy/v0_11"
|
v0_11committee "github.com/kava-labs/kava/x/committee/legacy/v0_11"
|
||||||
|
v0_13hard "github.com/kava-labs/kava/x/hard"
|
||||||
|
v0_11hard "github.com/kava-labs/kava/x/hard/legacy/v0_11"
|
||||||
|
v0_13incentive "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"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
GenesisTime = time.Date(2021, 3, 4, 14, 0, 0, 0, time.UTC)
|
||||||
|
RewardEndTime = time.Date(2022, 2, 25, 14, 0, 0, 0, time.UTC)
|
||||||
|
ClaimEndTime = time.Date(2026, 2, 25, 14, 0, 0, 0, time.UTC)
|
||||||
)
|
)
|
||||||
|
|
||||||
// CDP migrates from a v0.11 cdp genesis state to a v0.13 cdp genesis state
|
// CDP migrates from a v0.11 cdp genesis state to a v0.13 cdp genesis state
|
||||||
@ -80,12 +92,242 @@ func CDP(oldGenState v0_11cdp.GenesisState) v0_13cdp.GenesisState {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hard migrates from a v0.11 hard (harvest) genesis state to a v0.13 hard genesis state
|
||||||
|
func Hard(genesisState v0_11hard.GenesisState) v0_13hard.GenesisState {
|
||||||
|
v13Deposits := v0_13hard.Deposits{}
|
||||||
|
v13DepositorMap := make(map[string]v0_13hard.Deposit)
|
||||||
|
v13GenesisAccumulationTimes := v0_13hard.GenesisAccumulationTimes{}
|
||||||
|
v13TotalSupplied := sdk.NewCoins()
|
||||||
|
|
||||||
|
for _, dep := range genesisState.Deposits {
|
||||||
|
v13Deposit, ok := v13DepositorMap[dep.Depositor.String()]
|
||||||
|
if !ok {
|
||||||
|
v13Deposit := v0_13hard.NewDeposit(dep.Depositor, sdk.NewCoins(dep.Amount), v0_13hard.SupplyInterestFactors{v0_13hard.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_13hard.NewSupplyInterestFactor(dep.Amount.Denom, sdk.OneDec()))
|
||||||
|
v13DepositorMap[dep.Depositor.String()] = v13Deposit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defaultInterestModel := v0_13hard.NewInterestRateModel(sdk.ZeroDec(), sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("1.0"))
|
||||||
|
newParams := v0_13hard.NewParams(
|
||||||
|
v0_13hard.MoneyMarkets{
|
||||||
|
|
||||||
|
v0_13hard.NewMoneyMarket("btcb", v0_13hard.NewBorrowLimit(true, sdk.ZeroDec(), sdk.MustNewDecFromStr("0.5")), "btc:usd", sdk.NewInt(100000000),
|
||||||
|
defaultInterestModel,
|
||||||
|
sdk.MustNewDecFromStr("0.025"), sdk.MustNewDecFromStr("0.02"),
|
||||||
|
),
|
||||||
|
// bnb
|
||||||
|
v0_13hard.NewMoneyMarket("bnb", v0_13hard.NewBorrowLimit(true, sdk.ZeroDec(), sdk.MustNewDecFromStr("0.5")), "bnb:usd", sdk.NewInt(100000000),
|
||||||
|
defaultInterestModel,
|
||||||
|
sdk.MustNewDecFromStr("0.025"), sdk.MustNewDecFromStr("0.02"),
|
||||||
|
),
|
||||||
|
// xrpb
|
||||||
|
v0_13hard.NewMoneyMarket("xrpb", v0_13hard.NewBorrowLimit(true, sdk.ZeroDec(), sdk.MustNewDecFromStr("0.5")), "xrp:usd", sdk.NewInt(100000000),
|
||||||
|
defaultInterestModel,
|
||||||
|
sdk.MustNewDecFromStr("0.025"), sdk.MustNewDecFromStr("0.02"),
|
||||||
|
),
|
||||||
|
// busd
|
||||||
|
v0_13hard.NewMoneyMarket("busd", v0_13hard.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_13hard.NewMoneyMarket("usdx", v0_13hard.NewBorrowLimit(true, sdk.ZeroDec(), sdk.ZeroDec()), "usdx:usd", sdk.NewInt(1000000),
|
||||||
|
defaultInterestModel,
|
||||||
|
sdk.MustNewDecFromStr("0.025"), sdk.MustNewDecFromStr("0.02"),
|
||||||
|
),
|
||||||
|
// ukava
|
||||||
|
v0_13hard.NewMoneyMarket("ukava", v0_13hard.NewBorrowLimit(true, sdk.ZeroDec(), sdk.MustNewDecFromStr("0.5")), "kava:usd", sdk.NewInt(1000000),
|
||||||
|
defaultInterestModel,
|
||||||
|
sdk.MustNewDecFromStr("0.025"), sdk.MustNewDecFromStr("0.02"),
|
||||||
|
),
|
||||||
|
// hard
|
||||||
|
v0_13hard.NewMoneyMarket("hard", v0_13hard.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_13hard.NewGenesisAccumulationTime(mm.Denom, GenesisTime, sdk.OneDec(), sdk.OneDec())
|
||||||
|
v13GenesisAccumulationTimes = append(v13GenesisAccumulationTimes, genAccumulationTime)
|
||||||
|
}
|
||||||
|
|
||||||
|
return v0_13hard.NewGenesisState(newParams, v13GenesisAccumulationTimes, v13Deposits, v0_13hard.DefaultBorrows, v13TotalSupplied, v0_13hard.DefaultTotalBorrowed, v0_13hard.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_13incentive.GenesisState {
|
||||||
|
usdxMintingRewardPeriods := v0_13incentive.RewardPeriods{}
|
||||||
|
usdxRewardsPerSecondMap := make(map[string]sdk.Coin)
|
||||||
|
usdxRewardsPerSecondMap["bnb-a"] = sdk.NewCoin("ukava", sdk.NewInt(122354))
|
||||||
|
usdxRewardsPerSecondMap["btcb-a"] = sdk.NewCoin("ukava", sdk.NewInt(158730))
|
||||||
|
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))
|
||||||
|
|
||||||
|
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_13incentive.NewRewardPeriod(true, rp.CollateralType, GenesisTime, RewardEndTime, rewardsPerSecond)
|
||||||
|
usdxMintingRewardPeriods = append(usdxMintingRewardPeriods, newRP)
|
||||||
|
}
|
||||||
|
|
||||||
|
hardSupplyRewardPeriods := v0_13incentive.MultiRewardPeriods{}
|
||||||
|
for _, rp := range hardGS.Params.LiquidityProviderSchedules {
|
||||||
|
newRP := v0_13incentive.NewMultiRewardPeriod(true, rp.DepositDenom, rp.Start, rp.End, sdk.NewCoins(rp.RewardsPerSecond))
|
||||||
|
hardSupplyRewardPeriods = append(hardSupplyRewardPeriods, newRP)
|
||||||
|
}
|
||||||
|
hardBorrowRewardPeriods := v0_13incentive.MultiRewardPeriods{}
|
||||||
|
hardDelegatorRewardPeriods := v0_13incentive.RewardPeriods{}
|
||||||
|
for _, rp := range hardGS.Params.DelegatorDistributionSchedules {
|
||||||
|
newRP := v0_13incentive.NewRewardPeriod(rp.DistributionSchedule.Active, rp.DistributionSchedule.DepositDenom, rp.DistributionSchedule.Start, rp.DistributionSchedule.End, rp.DistributionSchedule.RewardsPerSecond)
|
||||||
|
hardDelegatorRewardPeriods = append(hardDelegatorRewardPeriods, newRP)
|
||||||
|
}
|
||||||
|
params := v0_13incentive.NewParams(usdxMintingRewardPeriods, hardSupplyRewardPeriods, hardBorrowRewardPeriods, hardDelegatorRewardPeriods, v0_13incentive.Multipliers{v0_13incentive.NewMultiplier(v0_13incentive.Small, 1, sdk.MustNewDecFromStr("0.2")), v0_13incentive.NewMultiplier(v0_13incentive.Large, 12, sdk.MustNewDecFromStr("1.0"))}, ClaimEndTime)
|
||||||
|
|
||||||
|
usdxGenAccumulationTimes := v0_13incentive.GenesisAccumulationTimes{}
|
||||||
|
|
||||||
|
for _, rp := range params.USDXMintingRewardPeriods {
|
||||||
|
gat := v0_13incentive.NewGenesisAccumulationTime(rp.CollateralType, GenesisTime, sdk.ZeroDec())
|
||||||
|
usdxGenAccumulationTimes = append(usdxGenAccumulationTimes, gat)
|
||||||
|
}
|
||||||
|
hardSupplyGenAccumulationTimes := v0_13incentive.GenesisAccumulationTimes{}
|
||||||
|
for _, rp := range params.HardSupplyRewardPeriods {
|
||||||
|
gat := v0_13incentive.NewGenesisAccumulationTime(rp.CollateralType, GenesisTime, sdk.ZeroDec())
|
||||||
|
hardSupplyGenAccumulationTimes = append(hardSupplyGenAccumulationTimes, gat)
|
||||||
|
}
|
||||||
|
hardBorrowGenAccumulationTimes := v0_13incentive.GenesisAccumulationTimes{}
|
||||||
|
for _, rp := range params.HardBorrowRewardPeriods {
|
||||||
|
gat := v0_13incentive.NewGenesisAccumulationTime(rp.CollateralType, GenesisTime, sdk.ZeroDec())
|
||||||
|
hardBorrowGenAccumulationTimes = append(hardBorrowGenAccumulationTimes, gat)
|
||||||
|
}
|
||||||
|
|
||||||
|
hardDelegatorGenAccumulationTimes := v0_13incentive.GenesisAccumulationTimes{}
|
||||||
|
|
||||||
|
for _, rp := range params.HardDelegatorRewardPeriods {
|
||||||
|
gat := v0_13incentive.NewGenesisAccumulationTime(rp.CollateralType, GenesisTime, sdk.ZeroDec())
|
||||||
|
hardDelegatorGenAccumulationTimes = append(hardDelegatorGenAccumulationTimes, gat)
|
||||||
|
}
|
||||||
|
|
||||||
|
usdxClaims := v0_13incentive.USDXMintingClaims{}
|
||||||
|
usdxClaimMap := make(map[string]v0_13incentive.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_13incentive.NewUSDXMintingClaim(claim.Owner, claim.Reward, v0_13incentive.RewardIndexes{v0_13incentive.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_13incentive.NewRewardIndex(claim.CollateralType, sdk.ZeroDec()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
usdxClaimMap[newClaim.Owner.String()] = newClaim
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, claim := range usdxClaimMap {
|
||||||
|
usdxClaims = append(usdxClaims, claim)
|
||||||
|
}
|
||||||
|
|
||||||
|
hardClaims := v0_13incentive.HardLiquidityProviderClaims{}
|
||||||
|
hardClaimMap := make(map[string]v0_13incentive.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_13incentive.RewardIndexes{}
|
||||||
|
supplyIndexes := v0_13incentive.MultiRewardIndexes{}
|
||||||
|
borrowIndexes := v0_13incentive.MultiRewardIndexes{}
|
||||||
|
if claim.Type == v0_11hard.Stake {
|
||||||
|
delegatorIndexes = v0_13incentive.RewardIndexes{v0_13incentive.NewRewardIndex(claim.DepositDenom, sdk.ZeroDec())}
|
||||||
|
}
|
||||||
|
if claim.Type == v0_11hard.LP {
|
||||||
|
supplyIndexes = v0_13incentive.MultiRewardIndexes{v0_13incentive.NewMultiRewardIndex(claim.DepositDenom, v0_13incentive.RewardIndexes{v0_13incentive.NewRewardIndex("hard", sdk.ZeroDec())})}
|
||||||
|
}
|
||||||
|
newClaim = v0_13incentive.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_13incentive.RewardIndexes{v0_13incentive.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_13incentive.NewMultiRewardIndex(claim.DepositDenom, v0_13incentive.RewardIndexes{v0_13incentive.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_13incentive.NewGenesisState(
|
||||||
|
params,
|
||||||
|
usdxGenAccumulationTimes,
|
||||||
|
hardSupplyGenAccumulationTimes,
|
||||||
|
hardBorrowGenAccumulationTimes,
|
||||||
|
hardDelegatorGenAccumulationTimes,
|
||||||
|
usdxClaims,
|
||||||
|
hardClaims,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// Auth migrates from a v0.11 auth genesis state to a v0.13
|
// Auth migrates from a v0.11 auth genesis state to a v0.13
|
||||||
func Auth(genesisState auth.GenesisState) auth.GenesisState {
|
func Auth(genesisState auth.GenesisState) auth.GenesisState {
|
||||||
savingsRateMaccCoins := sdk.NewCoins()
|
savingsRateMaccCoins := sdk.NewCoins()
|
||||||
savingsMaccAddr := supply.NewModuleAddress(v0_11cdp.SavingsRateMacc)
|
savingsMaccAddr := supply.NewModuleAddress(v0_11cdp.SavingsRateMacc)
|
||||||
savingsRateMaccIndex := 0
|
savingsRateMaccIndex := 0
|
||||||
liquidatorMaccIndex := 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 {
|
for idx, acc := range genesisState.Accounts {
|
||||||
if acc.GetAddress().Equals(savingsMaccAddr) {
|
if acc.GetAddress().Equals(savingsMaccAddr) {
|
||||||
savingsRateMaccCoins = acc.GetCoins()
|
savingsRateMaccCoins = acc.GetCoins()
|
||||||
@ -98,7 +340,23 @@ func Auth(genesisState auth.GenesisState) auth.GenesisState {
|
|||||||
if acc.GetAddress().Equals(supply.NewModuleAddress(v0_13cdp.LiquidatorMacc)) {
|
if acc.GetAddress().Equals(supply.NewModuleAddress(v0_13cdp.LiquidatorMacc)) {
|
||||||
liquidatorMaccIndex = idx
|
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]
|
liquidatorAcc := genesisState.Accounts[liquidatorMaccIndex]
|
||||||
err := liquidatorAcc.SetCoins(liquidatorAcc.GetCoins().Add(savingsRateMaccCoins...))
|
err := liquidatorAcc.SetCoins(liquidatorAcc.GetCoins().Add(savingsRateMaccCoins...))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -106,7 +364,30 @@ func Auth(genesisState auth.GenesisState) auth.GenesisState {
|
|||||||
}
|
}
|
||||||
genesisState.Accounts[liquidatorMaccIndex] = liquidatorAcc
|
genesisState.Accounts[liquidatorMaccIndex] = liquidatorAcc
|
||||||
|
|
||||||
genesisState.Accounts = removeIndex(genesisState.Accounts, savingsRateMaccIndex)
|
// migrate harvest account to new hard name
|
||||||
|
harvestAcc := genesisState.Accounts[harvestIdx].(*supply.ModuleAccount)
|
||||||
|
harvestAcc.Address = supply.NewModuleAddress(v0_13hard.ModuleAccountName)
|
||||||
|
harvestAcc.Name = v0_13hard.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
|
return genesisState
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,5 +509,6 @@ func Committee(genesisState v0_11committee.GenesisState) v0_13committee.GenesisS
|
|||||||
func removeIndex(accs authexported.GenesisAccounts, index int) authexported.GenesisAccounts {
|
func removeIndex(accs authexported.GenesisAccounts, index int) authexported.GenesisAccounts {
|
||||||
ret := make(authexported.GenesisAccounts, 0)
|
ret := make(authexported.GenesisAccounts, 0)
|
||||||
ret = append(ret, accs[:index]...)
|
ret = append(ret, accs[:index]...)
|
||||||
return append(ret, accs[index+1:]...)
|
newAccounts := append(ret, accs[index+1:]...)
|
||||||
|
return newAccounts
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package v0_13
|
package v0_13
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -9,11 +10,18 @@ import (
|
|||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth"
|
"github.com/cosmos/cosmos-sdk/x/auth"
|
||||||
|
authexported "github.com/cosmos/cosmos-sdk/x/auth/exported"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/supply"
|
||||||
|
supplyexported "github.com/cosmos/cosmos-sdk/x/supply/exported"
|
||||||
|
|
||||||
"github.com/kava-labs/kava/app"
|
"github.com/kava-labs/kava/app"
|
||||||
v0_11cdp "github.com/kava-labs/kava/x/cdp/legacy/v0_11"
|
v0_11cdp "github.com/kava-labs/kava/x/cdp/legacy/v0_11"
|
||||||
v0_13committee "github.com/kava-labs/kava/x/committee"
|
v0_13committee "github.com/kava-labs/kava/x/committee"
|
||||||
v0_11committee "github.com/kava-labs/kava/x/committee/legacy/v0_11"
|
v0_11committee "github.com/kava-labs/kava/x/committee/legacy/v0_11"
|
||||||
|
v0_13hard "github.com/kava-labs/kava/x/hard"
|
||||||
|
v0_11hard "github.com/kava-labs/kava/x/hard/legacy/v0_11"
|
||||||
|
v0_13incentive "github.com/kava-labs/kava/x/incentive"
|
||||||
|
v0_11incentive "github.com/kava-labs/kava/x/incentive/legacy/v0_11"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
@ -54,11 +62,74 @@ func TestAuth(t *testing.T) {
|
|||||||
require.NotPanics(t, func() {
|
require.NotPanics(t, func() {
|
||||||
cdc.MustUnmarshalJSON(bz, &oldGenState)
|
cdc.MustUnmarshalJSON(bz, &oldGenState)
|
||||||
})
|
})
|
||||||
|
harvestCoins := getModuleAccount(oldGenState.Accounts, "harvest").GetCoins()
|
||||||
|
|
||||||
newGenState := Auth(oldGenState)
|
newGenState := Auth(oldGenState)
|
||||||
|
|
||||||
err = auth.ValidateGenesis(newGenState)
|
err = auth.ValidateGenesis(newGenState)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, len(oldGenState.Accounts), len(newGenState.Accounts)+1)
|
require.Equal(t, len(oldGenState.Accounts), len(newGenState.Accounts)+3)
|
||||||
|
require.Nil(t, getModuleAccount(newGenState.Accounts, "harvest"))
|
||||||
|
require.Equal(t, getModuleAccount(newGenState.Accounts, "hard").GetCoins(), harvestCoins)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getModuleAccount(accounts authexported.GenesisAccounts, name string) supplyexported.ModuleAccountI {
|
||||||
|
modAcc, ok := getAccount(accounts, supply.NewModuleAddress(name)).(supplyexported.ModuleAccountI)
|
||||||
|
if !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return modAcc
|
||||||
|
}
|
||||||
|
func getAccount(accounts authexported.GenesisAccounts, address sdk.AccAddress) authexported.GenesisAccount {
|
||||||
|
for _, acc := range accounts {
|
||||||
|
if acc.GetAddress().Equals(address) {
|
||||||
|
return acc
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIncentive(t *testing.T) {
|
||||||
|
bz, err := ioutil.ReadFile(filepath.Join("testdata", "kava-4-incentive-state.json"))
|
||||||
|
require.NoError(t, err)
|
||||||
|
var oldIncentiveGenState v0_11incentive.GenesisState
|
||||||
|
cdc := app.MakeCodec()
|
||||||
|
require.NotPanics(t, func() {
|
||||||
|
cdc.MustUnmarshalJSON(bz, &oldIncentiveGenState)
|
||||||
|
})
|
||||||
|
|
||||||
|
bz, err = ioutil.ReadFile(filepath.Join("testdata", "kava-4-harvest-state.json"))
|
||||||
|
require.NoError(t, err)
|
||||||
|
var oldHarvestGenState v0_11hard.GenesisState
|
||||||
|
require.NotPanics(t, func() {
|
||||||
|
cdc.MustUnmarshalJSON(bz, &oldHarvestGenState)
|
||||||
|
})
|
||||||
|
newGenState := v0_13incentive.GenesisState{}
|
||||||
|
require.NotPanics(t, func() {
|
||||||
|
newGenState = Incentive(oldHarvestGenState, oldIncentiveGenState)
|
||||||
|
})
|
||||||
|
err = newGenState.Validate()
|
||||||
|
require.NoError(t, err)
|
||||||
|
fmt.Printf("Number of incentive claims in kava-4: %d\nNumber of incentive Claims in kava-5: %d\n",
|
||||||
|
len(oldIncentiveGenState.Claims), len(newGenState.USDXMintingClaims),
|
||||||
|
)
|
||||||
|
fmt.Printf("Number of harvest claims in kava-4: %d\nNumber of hard claims in kava-5: %d\n", len(oldHarvestGenState.Claims), len(newGenState.HardLiquidityProviderClaims))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHard(t *testing.T) {
|
||||||
|
cdc := app.MakeCodec()
|
||||||
|
bz, err := ioutil.ReadFile(filepath.Join("testdata", "kava-4-harvest-state.json"))
|
||||||
|
require.NoError(t, err)
|
||||||
|
var oldHarvestGenState v0_11hard.GenesisState
|
||||||
|
require.NotPanics(t, func() {
|
||||||
|
cdc.MustUnmarshalJSON(bz, &oldHarvestGenState)
|
||||||
|
})
|
||||||
|
newGenState := v0_13hard.GenesisState{}
|
||||||
|
require.NotPanics(t, func() {
|
||||||
|
newGenState = Hard(oldHarvestGenState)
|
||||||
|
})
|
||||||
|
err = newGenState.Validate()
|
||||||
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCommittee(t *testing.T) {
|
func TestCommittee(t *testing.T) {
|
||||||
|
1
migrate/v0_13/testdata/kava-4-harvest-state.json
vendored
Normal file
1
migrate/v0_13/testdata/kava-4-harvest-state.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
migrate/v0_13/testdata/kava-4-incentive-state.json
vendored
Normal file
1
migrate/v0_13/testdata/kava-4-incentive-state.json
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -39,6 +39,8 @@ var (
|
|||||||
DefaultDelegatorSchedules = DelegatorDistributionSchedules{}
|
DefaultDelegatorSchedules = DelegatorDistributionSchedules{}
|
||||||
DefaultPreviousBlockTime = tmtime.Canonical(time.Unix(0, 0))
|
DefaultPreviousBlockTime = tmtime.Canonical(time.Unix(0, 0))
|
||||||
DefaultDistributionTimes = GenesisDistributionTimes{}
|
DefaultDistributionTimes = GenesisDistributionTimes{}
|
||||||
|
DefaultDeposits = Deposits{}
|
||||||
|
DefaultClaims = Claims{}
|
||||||
GovDenom = cdptypes.DefaultGovDenom
|
GovDenom = cdptypes.DefaultGovDenom
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -47,14 +49,18 @@ type GenesisState struct {
|
|||||||
Params Params `json:"params" yaml:"params"`
|
Params Params `json:"params" yaml:"params"`
|
||||||
PreviousBlockTime time.Time `json:"previous_block_time" yaml:"previous_block_time"`
|
PreviousBlockTime time.Time `json:"previous_block_time" yaml:"previous_block_time"`
|
||||||
PreviousDistributionTimes GenesisDistributionTimes `json:"previous_distribution_times" yaml:"previous_distribution_times"`
|
PreviousDistributionTimes GenesisDistributionTimes `json:"previous_distribution_times" yaml:"previous_distribution_times"`
|
||||||
|
Deposits Deposits `json:"deposits" yaml:"deposits"`
|
||||||
|
Claims Claims `json:"claims" yaml:"claims"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGenesisState returns a new genesis state
|
// NewGenesisState returns a new genesis state
|
||||||
func NewGenesisState(params Params, previousBlockTime time.Time, previousDistTimes GenesisDistributionTimes) GenesisState {
|
func NewGenesisState(params Params, previousBlockTime time.Time, previousDistTimes GenesisDistributionTimes, deposits Deposits, claims Claims) GenesisState {
|
||||||
return GenesisState{
|
return GenesisState{
|
||||||
Params: params,
|
Params: params,
|
||||||
PreviousBlockTime: previousBlockTime,
|
PreviousBlockTime: previousBlockTime,
|
||||||
PreviousDistributionTimes: previousDistTimes,
|
PreviousDistributionTimes: previousDistTimes,
|
||||||
|
Deposits: deposits,
|
||||||
|
Claims: claims,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,6 +85,17 @@ func (gs GenesisState) Validate() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DefaultGenesisState returns a default genesis state
|
||||||
|
func DefaultGenesisState() GenesisState {
|
||||||
|
return GenesisState{
|
||||||
|
Params: DefaultParams(),
|
||||||
|
PreviousBlockTime: DefaultPreviousBlockTime,
|
||||||
|
PreviousDistributionTimes: DefaultDistributionTimes,
|
||||||
|
Deposits: DefaultDeposits,
|
||||||
|
Claims: DefaultClaims,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// GenesisDistributionTime stores the previous distribution time and its corresponding denom
|
// GenesisDistributionTime stores the previous distribution time and its corresponding denom
|
||||||
type GenesisDistributionTime struct {
|
type GenesisDistributionTime struct {
|
||||||
Denom string `json:"denom" yaml:"denom"`
|
Denom string `json:"denom" yaml:"denom"`
|
||||||
@ -422,6 +439,9 @@ func NewDeposit(depositor sdk.AccAddress, amount sdk.Coin, dtype DepositType) De
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deposits slice of Deposit
|
||||||
|
type Deposits []Deposit
|
||||||
|
|
||||||
// Claim defines an amount of coins that the owner can claim
|
// Claim defines an amount of coins that the owner can claim
|
||||||
type Claim struct {
|
type Claim struct {
|
||||||
Owner sdk.AccAddress `json:"owner" yaml:"owner"`
|
Owner sdk.AccAddress `json:"owner" yaml:"owner"`
|
||||||
@ -440,6 +460,9 @@ func NewClaim(owner sdk.AccAddress, denom string, amount sdk.Coin, dtype Deposit
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Claims slice of Claim
|
||||||
|
type Claims []Claim
|
||||||
|
|
||||||
// NewPeriod returns a new vesting period
|
// NewPeriod returns a new vesting period
|
||||||
func NewPeriod(amount sdk.Coins, length int64) vesting.Period {
|
func NewPeriod(amount sdk.Coins, length int64) vesting.Period {
|
||||||
return vesting.Period{Amount: amount, Length: length}
|
return vesting.Period{Amount: amount, Length: length}
|
||||||
|
@ -18,7 +18,6 @@ type SupplyKeeper interface {
|
|||||||
SendCoinsFromModuleToModule(ctx sdk.Context, senderModule, recipientModule string, amt sdk.Coins) error
|
SendCoinsFromModuleToModule(ctx sdk.Context, senderModule, recipientModule string, amt sdk.Coins) error
|
||||||
SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error
|
SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error
|
||||||
SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error
|
SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error
|
||||||
MintCoins(ctx sdk.Context, name string, amt sdk.Coins) error
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AccountKeeper defines the expected keeper interface for interacting with account
|
// AccountKeeper defines the expected keeper interface for interacting with account
|
||||||
|
Loading…
Reference in New Issue
Block a user