Skip to content

Commit

Permalink
feat(ecocredit): add core state params migrations (#1417)
Browse files Browse the repository at this point in the history
* feat: add core state migrations

* chore: add changelog

* Apply suggestions from code review

Co-authored-by: Tyler <48813565+technicallyty@users.noreply.github.com>

Co-authored-by: Ryan Christoffersen <12519942+ryanchristo@users.noreply.github.com>
Co-authored-by: Tyler <48813565+technicallyty@users.noreply.github.com>
  • Loading branch information
3 people committed Aug 29, 2022
1 parent fbde113 commit b86c330
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 13 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- [#1354](https://github.com/regen-network/regen-ledger/pull/1354) Add `UpdateClassFees` msg-based gov proposal
- [#1391](https://github.com/regen-network/regen-ledger/pull/1391) Add `BasketFees` params query
- [#1412](https://github.com/regen-network/regen-ledger/pull/1412) Add `EventRemoveAllowedDenom`
- [#1417](https://github.com/regen-network/regen-ledger/pull/1417) Add ecocredit params state migration

#### Changed

Expand Down
49 changes: 38 additions & 11 deletions x/ecocredit/migrations/v3/state.go
Original file line number Diff line number Diff line change
@@ -1,35 +1,62 @@
package v3

import (
basev1beta1 "github.com/cosmos/cosmos-sdk/api/cosmos/base/v1beta1"
sdk "github.com/cosmos/cosmos-sdk/types"
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"

basketapi "github.com/regen-network/regen-ledger/api/regen/ecocredit/basket/v1"
api "github.com/regen-network/regen-ledger/api/regen/ecocredit/v1"
"github.com/regen-network/regen-ledger/types"
"github.com/regen-network/regen-ledger/x/ecocredit/core"
)

// MigrateState performs in-place store migrations from ConsensusVersion 2 to 3.
func MigrateState(sdkCtx sdk.Context, ss api.StateStore, basketStore basketapi.StateStore, subspace paramtypes.Subspace) error {
// TODO: migrate core params
func MigrateState(sdkCtx sdk.Context, coreStore api.StateStore, basketStore basketapi.StateStore, subspace paramtypes.Subspace) error {

// migrate basket params
var params core.Params
subspace.GetParamSet(sdkCtx, &params)

// validate credit class fee
if err := params.CreditClassFee.Validate(); err != nil {
return err
}

// migrate credit class fees
classFees := types.CoinsToProtoCoins(params.CreditClassFee)
if err := coreStore.ClassFeesTable().Save(sdkCtx, &api.ClassFees{
Fees: classFees,
}); err != nil {
return err
}

// migrate credit class allow list
if err := coreStore.AllowListEnabledTable().Save(sdkCtx, &api.AllowListEnabled{
Enabled: params.AllowlistEnabled,
}); err != nil {
return err
}

// migrate allowed class creators to orm table
for _, creator := range params.AllowedClassCreators {
addr, err := sdk.AccAddressFromBech32(creator)
if err != nil {
return err
}

if err := coreStore.AllowedClassCreatorTable().Save(sdkCtx, &api.AllowedClassCreator{
Address: addr,
}); err != nil {
return err
}
}

// verify basket fee is valid
if err := params.BasketFee.Validate(); err != nil {
return err
}

basketFees := []*basev1beta1.Coin{}
for _, coin := range params.BasketFee {
basketFees = append(basketFees, &basev1beta1.Coin{
Denom: coin.Denom,
Amount: coin.Amount.String(),
})
}
// migrate basket params
basketFees := types.CoinsToProtoCoins(params.BasketFee)
if err := basketStore.BasketFeesTable().Save(sdkCtx, &basketapi.BasketFees{
Fees: basketFees,
}); err != nil {
Expand Down
35 changes: 33 additions & 2 deletions x/ecocredit/migrations/v3/state_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,14 @@ func TestMigrations(t *testing.T) {

paramStore.WithKeyTable(core.ParamKeyTable())

creator1 := sdk.AccAddress("creator1")
creator2 := sdk.AccAddress("creator2")

// initialize params
paramStore.SetParamSet(sdkCtx, &core.Params{
CreditClassFee: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10))),
CreditClassFee: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10)), sdk.NewCoin("uregen", sdk.NewInt(2000000))),
BasketFee: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10)), sdk.NewCoin("uregen", sdk.NewInt(2000000))),
AllowedClassCreators: []string{},
AllowedClassCreators: []string{creator1.String(), creator2.String()},
AllowlistEnabled: true,
})

Expand All @@ -70,4 +73,32 @@ func TestMigrations(t *testing.T) {
assert.Equal(t, basketFees.Fees[0].Amount, "10")
assert.Equal(t, basketFees.Fees[1].Denom, "uregen")
assert.Equal(t, basketFees.Fees[1].Amount, "2000000")

// verify core state migrated to orm table
classFees, err := coreStore.ClassFeesTable().Get(sdkCtx)
assert.NilError(t, err)

assert.Equal(t, len(classFees.Fees), 2)
assert.Equal(t, classFees.Fees[0].Denom, sdk.DefaultBondDenom)
assert.Equal(t, classFees.Fees[0].Amount, "10")
assert.Equal(t, classFees.Fees[1].Denom, "uregen")
assert.Equal(t, classFees.Fees[1].Amount, "2000000")

allowedListEnabled, err := coreStore.AllowListEnabledTable().Get(sdkCtx)
assert.NilError(t, err)
assert.Equal(t, allowedListEnabled.Enabled, true)

itr, err := coreStore.AllowedClassCreatorTable().List(sdkCtx, api.AllowedClassCreatorPrimaryKey{})
assert.NilError(t, err)

var expected []string
for itr.Next() {
val, err := itr.Value()
assert.NilError(t, err)

expected = append(expected, sdk.AccAddress(val.Address).String())
}
itr.Close()

assert.DeepEqual(t, params.AllowedClassCreators, expected)
}

0 comments on commit b86c330

Please sign in to comment.