From 314cd4c007fc7700158161b32a5c502062762d7c Mon Sep 17 00:00:00 2001 From: Egor Kostetskiy Date: Thu, 14 Sep 2023 20:25:45 -0300 Subject: [PATCH 1/8] eg for metoken --- app/app.go | 1 + x/metoken/keeper/keeper.go | 6 + x/metoken/keeper/metoken.go | 191 +++++++++++++++++++++++-------- x/metoken/keeper/metoken_test.go | 52 ++++++++- x/metoken/keeper/msg_server.go | 10 +- x/metoken/keeper/unit_test.go | 2 +- x/metoken/msgs.go | 4 - 7 files changed, 209 insertions(+), 57 deletions(-) diff --git a/app/app.go b/app/app.go index 49e00eeaef..3d775fbf33 100644 --- a/app/app.go +++ b/app/app.go @@ -506,6 +506,7 @@ func New( app.BankKeeper, app.LeverageKeeper, app.OracleKeeper, + app.UGovKeeperB.EmergencyGroup, ) } diff --git a/x/metoken/keeper/keeper.go b/x/metoken/keeper/keeper.go index 006c5ce79f..95ef1c0843 100644 --- a/x/metoken/keeper/keeper.go +++ b/x/metoken/keeper/keeper.go @@ -5,6 +5,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/tendermint/tendermint/libs/log" + "github.com/umee-network/umee/v6/x/ugov" "github.com/umee-network/umee/v6/x/metoken" ) @@ -16,6 +17,7 @@ type Builder struct { bankKeeper metoken.BankKeeper leverageKeeper metoken.LeverageKeeper oracleKeeper metoken.OracleKeeper + ugov ugov.EmergencyGroupBuilder } // NewKeeperBuilder returns Builder object. @@ -25,6 +27,7 @@ func NewKeeperBuilder( bankKeeper metoken.BankKeeper, leverageKeeper metoken.LeverageKeeper, oracleKeeper metoken.OracleKeeper, + ugov ugov.EmergencyGroupBuilder, ) Builder { return Builder{ cdc: cdc, @@ -32,6 +35,7 @@ func NewKeeperBuilder( bankKeeper: bankKeeper, leverageKeeper: leverageKeeper, oracleKeeper: oracleKeeper, + ugov: ugov, } } @@ -41,6 +45,7 @@ type Keeper struct { bankKeeper metoken.BankKeeper leverageKeeper metoken.LeverageKeeper oracleKeeper metoken.OracleKeeper + ugov ugov.EmergencyGroupBuilder // TODO: ctx should be removed when we migrate leverageKeeper and oracleKeeper ctx *sdk.Context @@ -54,6 +59,7 @@ func (b Builder) Keeper(ctx *sdk.Context) Keeper { bankKeeper: b.bankKeeper, leverageKeeper: b.leverageKeeper, oracleKeeper: b.oracleKeeper, + ugov: b.ugov, ctx: ctx, } } diff --git a/x/metoken/keeper/metoken.go b/x/metoken/keeper/metoken.go index 1c9c068dc5..a203edf0dd 100644 --- a/x/metoken/keeper/metoken.go +++ b/x/metoken/keeper/metoken.go @@ -2,6 +2,7 @@ package keeper import ( "errors" + "fmt" "time" sdkmath "cosmossdk.io/math" @@ -72,6 +73,7 @@ func (k Keeper) setNextInterestClaimTime(nextInterestClaimTime time.Time) { func (k Keeper) UpdateIndexes( addIndexes []metoken.Index, updateIndexes []metoken.Index, + byEmergencyGroup bool, ) error { registry := k.GetAllRegisteredIndexes() @@ -84,11 +86,34 @@ func (k Keeper) UpdateIndexes( } } - if err := k.addIndexes(addIndexes, registeredIndexes, registeredAssets); err != nil { - return err + var errs []error + if byEmergencyGroup { + if len(addIndexes) > 0 { + errs = append(errs, sdkerrors.ErrInvalidRequest.Wrapf("Emergency Group cannot register new indexes")) + } + + if updErrs := validateEmergencyIndexUpdate(updateIndexes, registeredIndexes); len(updErrs) > 0 { + errs = append(errs, updErrs...) + } + + if len(errs) > 0 { + return errors.Join(errs...) + } } - return k.updateIndexes(updateIndexes, registeredIndexes, registeredAssets) + if addErrs := k.addIndexes(addIndexes, registeredIndexes, registeredAssets); len(addErrs) > 0 { + errs = append(errs, addErrs...) + } + + if updErrs := k.updateIndexes(updateIndexes, registeredIndexes, registeredAssets); len(updErrs) > 0 { + errs = append(errs, updErrs...) + } + + if len(errs) > 0 { + return errors.Join(errs...) + } + + return nil } // addIndexes handles addition of the indexes from the request along with their validations. @@ -96,20 +121,32 @@ func (k Keeper) addIndexes( indexes []metoken.Index, registeredIndexes map[string]metoken.Index, registeredAssets map[string]string, -) error { +) []error { + var allErrs []error for _, index := range indexes { + var indexErrs []error if _, present := registeredIndexes[index.Denom]; present { - return sdkerrors.ErrInvalidRequest.Wrapf( - "add: index with denom %s already exists", - index.Denom, + allErrs = append( + allErrs, sdkerrors.ErrInvalidRequest.Wrapf( + "add: index with denom %s already exists", + index.Denom, + ), + ) + } + + if exists := k.hasIndexBalance(index.Denom); exists { + allErrs = append( + allErrs, sdkerrors.ErrInvalidRequest.Wrapf( + "can't add index %s - it already exists and is active", + index.Denom, + ), ) } - var errs []error for _, aa := range index.AcceptedAssets { if _, present := registeredAssets[aa.Denom]; present { - errs = append( - errs, sdkerrors.ErrInvalidRequest.Wrapf( + indexErrs = append( + indexErrs, sdkerrors.ErrInvalidRequest.Wrapf( "add: asset %s is already accepted in another index", aa.Denom, ), @@ -117,24 +154,18 @@ func (k Keeper) addIndexes( } } - if len(errs) != 0 { - return errors.Join(errs...) + if errs := k.validateInLeverage(index); len(errs) > 0 { + indexErrs = append(indexErrs, errs...) } - if err := k.validateInLeverage(index); err != nil { - return err - } - - if exists := k.hasIndexBalance(index.Denom); exists { - return sdkerrors.ErrInvalidRequest.Wrapf( - "can't add index %s - it already exists and is active", - index.Denom, - ) + if len(indexErrs) > 0 { + allErrs = append(allErrs, indexErrs...) + continue } // adding index if err := k.setRegisteredIndex(index); err != nil { - return err + return []error{err} } assetBalances := make([]metoken.AssetBalance, 0) @@ -151,10 +182,14 @@ func (k Keeper) addIndexes( ), assetBalances, ), ); err != nil { - return err + return []error{err} } } + if len(allErrs) != 0 { + return allErrs + } + return nil } @@ -163,21 +198,25 @@ func (k Keeper) updateIndexes( indexes []metoken.Index, registeredIndexes map[string]metoken.Index, registeredAssets map[string]string, -) error { +) []error { + var allErrs []error for _, index := range indexes { + var indexErrs []error oldIndex, present := registeredIndexes[index.Denom] if !present { - return sdkerrors.ErrNotFound.Wrapf( - "update: index with denom %s not found", - index.Denom, + allErrs = append( + allErrs, sdkerrors.ErrNotFound.Wrapf( + "update: index with denom %s not found", + index.Denom, + ), ) + continue } - var errs []error for _, aa := range index.AcceptedAssets { if indexDenom, present := registeredAssets[aa.Denom]; present && indexDenom != index.Denom { - errs = append( - errs, sdkerrors.ErrInvalidRequest.Wrapf( + indexErrs = append( + indexErrs, sdkerrors.ErrInvalidRequest.Wrapf( "add: asset %s is already accepted in another index", aa.Denom, ), @@ -185,43 +224,48 @@ func (k Keeper) updateIndexes( } } - if len(errs) != 0 { - return errors.Join(errs...) - } - if oldIndex.Exponent != index.Exponent { balances, err := k.IndexBalances(index.Denom) if err != nil { - return err + return []error{err} } if balances.MetokenSupply.IsPositive() { - return sdkerrors.ErrInvalidRequest.Wrapf( - "update: index %s exponent cannot be changed when supply is greater than zero", - index.Denom, + indexErrs = append( + indexErrs, sdkerrors.ErrInvalidRequest.Wrapf( + "update: index %s exponent cannot be changed when supply is greater than zero", + index.Denom, + ), ) } } for _, aa := range oldIndex.AcceptedAssets { if exists := index.HasAcceptedAsset(aa.Denom); !exists { - return sdkerrors.ErrInvalidRequest.Wrapf( - "update: an asset %s cannot be deleted from an index %s", - aa.Denom, - index.Denom, + indexErrs = append( + indexErrs, sdkerrors.ErrInvalidRequest.Wrapf( + "update: an asset %s cannot be deleted from an index %s", + aa.Denom, + index.Denom, + ), ) } } - if err := k.validateInLeverage(index); err != nil { - return err + if errs := k.validateInLeverage(index); len(errs) > 0 { + indexErrs = append(indexErrs, errs...) + } + + if len(indexErrs) > 0 { + allErrs = append(allErrs, indexErrs...) + continue } // updating balances if there is a new accepted asset if len(index.AcceptedAssets) > len(oldIndex.AcceptedAssets) { balances, err := k.IndexBalances(index.Denom) if err != nil { - return err + return []error{err} } for _, aa := range index.AcceptedAssets { @@ -231,27 +275,74 @@ func (k Keeper) updateIndexes( } if err := k.setIndexBalances(balances); err != nil { - return err + return []error{err} } } if err := k.setRegisteredIndex(index); err != nil { - return err + return []error{err} } } + if len(allErrs) != 0 { + return allErrs + } + return nil } +func validateEmergencyIndexUpdate(indexes []metoken.Index, registeredIndexes map[string]metoken.Index) []error { + var errs []error + for _, newIndex := range indexes { + oldIndex, ok := registeredIndexes[newIndex.Denom] + if !ok { + errs = append( + errs, sdkerrors.ErrNotFound.Wrapf( + "update: index with denom %s not found", + newIndex.Denom, + ), + ) + continue + } + + if newIndex.Exponent != oldIndex.Exponent { + errs = append(errs, errors.New("exponent cannot be changed")) + } + + if !newIndex.Fee.Equal(oldIndex.Fee) { + errs = append(errs, errors.New("fee cannot be changed")) + } + + if !newIndex.MaxSupply.Equal(oldIndex.MaxSupply) { + errs = append(errs, errors.New("max_supply cannot be changed")) + } + + for _, newAsset := range newIndex.AcceptedAssets { + oldAsset, i := oldIndex.AcceptedAsset(newAsset.Denom) + if i < 0 { + errs = append(errs, fmt.Errorf("new asset %s cannot be added", newAsset.Denom)) + continue + } + + if !newAsset.ReservePortion.Equal(oldAsset.ReservePortion) { + errs = append(errs, fmt.Errorf("reserve_portion of %s cannot be changed", newAsset.Denom)) + } + } + } + + return errs +} + // validateInLeverage validate the existence of every accepted asset in x/leverage -func (k Keeper) validateInLeverage(index metoken.Index) error { +func (k Keeper) validateInLeverage(index metoken.Index) []error { + var errs []error for _, aa := range index.AcceptedAssets { if _, err := k.leverageKeeper.GetTokenSettings(*k.ctx, aa.Denom); err != nil { - return err + errs = append(errs, err) } } - return nil + return errs } func ModuleAddr() sdk.AccAddress { diff --git a/x/metoken/keeper/metoken_test.go b/x/metoken/keeper/metoken_test.go index c3aa3f9a3d..71dd47951e 100644 --- a/x/metoken/keeper/metoken_test.go +++ b/x/metoken/keeper/metoken_test.go @@ -49,10 +49,25 @@ func TestIndex_AddAndUpdate(t *testing.T) { addDuplicatedAsset := mocks.StableIndex("me/Test") + egUpdateFailure := mocks.StableIndex(mocks.MeUSDDenom) + egUpdateFailure.Exponent -= 1 + egUpdateFailure.Fee.BalancedFee = sdk.MustNewDecFromStr("0.3") + egUpdateFailure.MaxSupply = egUpdateFailure.MaxSupply.Add(sdkmath.NewInt(1000)) + egUpdateFailure.AcceptedAssets = append( + egUpdateFailure.AcceptedAssets, metoken.NewAcceptedAsset( + "new", + sdk.MustNewDecFromStr("0.2"), sdk.MustNewDecFromStr("0.2"), + ), + ) + aa := egUpdateFailure.AcceptedAssets[0] + aa.ReservePortion = sdk.MustNewDecFromStr("0.5") + egUpdateFailure.SetAcceptedAsset(aa) + tcs := []struct { name string addIndex []metoken.Index updateIndex []metoken.Index + byEG bool errMsg string }{ { @@ -109,12 +124,47 @@ func TestIndex_AddAndUpdate(t *testing.T) { updateIndex: []metoken.Index{mocks.StableIndex(mocks.MeUSDDenom)}, errMsg: "", }, + { + name: "emergency group: index not found", + addIndex: nil, + updateIndex: []metoken.Index{mocks.StableIndex("me/NotFound")}, + byEG: true, + errMsg: "not found", + }, + { + name: "emergency group: exponent", + addIndex: nil, + updateIndex: []metoken.Index{egUpdateFailure}, + byEG: true, + errMsg: "exponent cannot be changed", + }, + { + name: "emergency group: fee", + addIndex: nil, + updateIndex: []metoken.Index{egUpdateFailure}, + byEG: true, + errMsg: "fee cannot be changed", + }, + { + name: "emergency group: new asset", + addIndex: nil, + updateIndex: []metoken.Index{egUpdateFailure}, + byEG: true, + errMsg: "new asset", + }, + { + name: "emergency group: reserve_portion", + addIndex: nil, + updateIndex: []metoken.Index{egUpdateFailure}, + byEG: true, + errMsg: "reserve_portion", + }, } for _, tc := range tcs { t.Run( tc.name, func(t *testing.T) { - err := k.UpdateIndexes(tc.addIndex, tc.updateIndex) + err := k.UpdateIndexes(tc.addIndex, tc.updateIndex, tc.byEG) if tc.errMsg != "" { assert.ErrorContains(t, err, tc.errMsg) } else { diff --git a/x/metoken/keeper/msg_server.go b/x/metoken/keeper/msg_server.go index 6481d01c2b..a1fe8fd9f5 100644 --- a/x/metoken/keeper/msg_server.go +++ b/x/metoken/keeper/msg_server.go @@ -3,6 +3,8 @@ package keeper import ( "context" + "github.com/umee-network/umee/v6/util/checkers" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/umee-network/umee/v6/util/sdkutil" @@ -134,12 +136,18 @@ func (m msgServer) GovUpdateRegistry( msg *metoken.MsgGovUpdateRegistry, ) (*metoken.MsgGovUpdateRegistryResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) + k := m.kb.Keeper(&ctx) + + byEmergencyGroup, err := checkers.EmergencyGroupAuthority(msg.Authority, k.ugov(&ctx)) + if err != nil { + return nil, err + } if err := msg.ValidateBasic(); err != nil { return nil, err } - if err := m.kb.Keeper(&ctx).UpdateIndexes(msg.AddIndex, msg.UpdateIndex); err != nil { + if err := k.UpdateIndexes(msg.AddIndex, msg.UpdateIndex, byEmergencyGroup); err != nil { return nil, err } diff --git a/x/metoken/keeper/unit_test.go b/x/metoken/keeper/unit_test.go index 60e9cb4a68..4315f7d18d 100644 --- a/x/metoken/keeper/unit_test.go +++ b/x/metoken/keeper/unit_test.go @@ -22,7 +22,7 @@ func initSimpleKeeper(t *testing.T) Keeper { interfaceRegistry := types.NewInterfaceRegistry() cdc := codec.NewProtoCodec(interfaceRegistry) storeKey := storetypes.NewMemoryStoreKey("metoken") - kb := NewKeeperBuilder(cdc, storeKey, nil, nil, nil) + kb := NewKeeperBuilder(cdc, storeKey, nil, nil, nil, nil) ctx, _ := tsdk.NewCtxOneStore(t, storeKey) return kb.Keeper(&ctx) diff --git a/x/metoken/msgs.go b/x/metoken/msgs.go index 3fb5e8f87f..47f529e46a 100644 --- a/x/metoken/msgs.go +++ b/x/metoken/msgs.go @@ -101,10 +101,6 @@ func NewMsgGovUpdateRegistry(authority string, addIndex, updateIndex []Index) *M // ValidateBasic implements Msg func (msg *MsgGovUpdateRegistry) ValidateBasic() error { - if err := checkers.AssertGovAuthority(msg.Authority); err != nil { - return err - } - if len(msg.AddIndex) == 0 && len(msg.UpdateIndex) == 0 { return sdkerrors.ErrInvalidRequest.Wrap("empty add and update indexes") } From 246537fc20b23973a27505d14d8a698970e8b3f7 Mon Sep 17 00:00:00 2001 From: Egor Kostetskiy Date: Tue, 26 Sep 2023 12:45:37 -0300 Subject: [PATCH 2/8] pr comments --- util/checkers/error.go | 8 ++++++ x/metoken/keeper/metoken.go | 47 ++++++++++++++-------------------- x/metoken/keeper/msg_server.go | 36 ++++++++++++-------------- 3 files changed, 43 insertions(+), 48 deletions(-) create mode 100644 util/checkers/error.go diff --git a/util/checkers/error.go b/util/checkers/error.go new file mode 100644 index 0000000000..76ba797803 --- /dev/null +++ b/util/checkers/error.go @@ -0,0 +1,8 @@ +package checkers + +func MergeErrors(errs1, errs2 []error) []error { + if len(errs2) > 0 { + return append(errs1, errs2...) + } + return errs1 +} diff --git a/x/metoken/keeper/metoken.go b/x/metoken/keeper/metoken.go index a203edf0dd..d62454f8ea 100644 --- a/x/metoken/keeper/metoken.go +++ b/x/metoken/keeper/metoken.go @@ -5,6 +5,8 @@ import ( "fmt" "time" + "github.com/umee-network/umee/v6/util/checkers" + sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -92,22 +94,16 @@ func (k Keeper) UpdateIndexes( errs = append(errs, sdkerrors.ErrInvalidRequest.Wrapf("Emergency Group cannot register new indexes")) } - if updErrs := validateEmergencyIndexUpdate(updateIndexes, registeredIndexes); len(updErrs) > 0 { - errs = append(errs, updErrs...) - } + errs = checkers.MergeErrors(errs, validateEGIndexUpdate(updateIndexes, registeredIndexes)) if len(errs) > 0 { return errors.Join(errs...) } } - if addErrs := k.addIndexes(addIndexes, registeredIndexes, registeredAssets); len(addErrs) > 0 { - errs = append(errs, addErrs...) - } + errs = checkers.MergeErrors(errs, k.addIndexes(addIndexes, registeredIndexes, registeredAssets)) - if updErrs := k.updateIndexes(updateIndexes, registeredIndexes, registeredAssets); len(updErrs) > 0 { - errs = append(errs, updErrs...) - } + errs = checkers.MergeErrors(errs, k.updateIndexes(updateIndexes, registeredIndexes, registeredAssets)) if len(errs) > 0 { return errors.Join(errs...) @@ -132,6 +128,7 @@ func (k Keeper) addIndexes( index.Denom, ), ) + continue } if exists := k.hasIndexBalance(index.Denom); exists { @@ -151,12 +148,11 @@ func (k Keeper) addIndexes( aa.Denom, ), ) + continue } } - if errs := k.validateInLeverage(index); len(errs) > 0 { - indexErrs = append(indexErrs, errs...) - } + checkers.MergeErrors(indexErrs, k.validateInLeverage(index)) if len(indexErrs) > 0 { allErrs = append(allErrs, indexErrs...) @@ -252,9 +248,7 @@ func (k Keeper) updateIndexes( } } - if errs := k.validateInLeverage(index); len(errs) > 0 { - indexErrs = append(indexErrs, errs...) - } + checkers.MergeErrors(indexErrs, k.validateInLeverage(index)) if len(indexErrs) > 0 { allErrs = append(allErrs, indexErrs...) @@ -291,41 +285,38 @@ func (k Keeper) updateIndexes( return nil } -func validateEmergencyIndexUpdate(indexes []metoken.Index, registeredIndexes map[string]metoken.Index) []error { +// validateEGIndexUpdate checks if emergency group can perform updates. +func validateEGIndexUpdate(indexes []metoken.Index, registeredIndexes map[string]metoken.Index) []error { var errs []error for _, newIndex := range indexes { - oldIndex, ok := registeredIndexes[newIndex.Denom] + d := newIndex.Denom + oldIndex, ok := registeredIndexes[d] if !ok { - errs = append( - errs, sdkerrors.ErrNotFound.Wrapf( - "update: index with denom %s not found", - newIndex.Denom, - ), - ) + errs = append(errs, sdkerrors.ErrNotFound.Wrapf("update: index with denom %s not found", d)) continue } if newIndex.Exponent != oldIndex.Exponent { - errs = append(errs, errors.New("exponent cannot be changed")) + errs = append(errs, errors.New(d+": exponent cannot be changed")) } if !newIndex.Fee.Equal(oldIndex.Fee) { - errs = append(errs, errors.New("fee cannot be changed")) + errs = append(errs, errors.New(d+": fee cannot be changed")) } if !newIndex.MaxSupply.Equal(oldIndex.MaxSupply) { - errs = append(errs, errors.New("max_supply cannot be changed")) + errs = append(errs, errors.New(d+": max_supply cannot be changed")) } for _, newAsset := range newIndex.AcceptedAssets { oldAsset, i := oldIndex.AcceptedAsset(newAsset.Denom) if i < 0 { - errs = append(errs, fmt.Errorf("new asset %s cannot be added", newAsset.Denom)) + errs = append(errs, fmt.Errorf("%s: new asset %s cannot be added", d, newAsset.Denom)) continue } if !newAsset.ReservePortion.Equal(oldAsset.ReservePortion) { - errs = append(errs, fmt.Errorf("reserve_portion of %s cannot be changed", newAsset.Denom)) + errs = append(errs, fmt.Errorf("%s: reserve_portion of %s cannot be changed", d, newAsset.Denom)) } } } diff --git a/x/metoken/keeper/msg_server.go b/x/metoken/keeper/msg_server.go index a1fe8fd9f5..3e26404fb0 100644 --- a/x/metoken/keeper/msg_server.go +++ b/x/metoken/keeper/msg_server.go @@ -3,11 +3,10 @@ package keeper import ( "context" - "github.com/umee-network/umee/v6/util/checkers" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/umee-network/umee/v6/util/sdkutil" + "github.com/umee-network/umee/v6/util/checkers" + "github.com/umee-network/umee/v6/util/sdkutil" "github.com/umee-network/umee/v6/x/metoken" ) @@ -25,10 +24,8 @@ func NewMsgServerImpl(kb Builder) metoken.MsgServer { // Swap handles the request for the swap, delegates the execution and returns the response. func (m msgServer) Swap(goCtx context.Context, msg *metoken.MsgSwap) (*metoken.MsgSwapResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - k := m.kb.Keeper(&ctx) - - if err := msg.ValidateBasic(); err != nil { + ctx, err := sdkutil.StartMsg(goCtx, msg) + if err != nil { return nil, err } @@ -36,7 +33,8 @@ func (m msgServer) Swap(goCtx context.Context, msg *metoken.MsgSwap) (*metoken.M if err != nil { return nil, err } - + + k := m.kb.Keeper(&ctx) resp, err := k.swap(userAddr, msg.MetokenDenom, msg.Asset) if err != nil { return nil, err @@ -68,10 +66,8 @@ func (m msgServer) Swap(goCtx context.Context, msg *metoken.MsgSwap) (*metoken.M // Redeem handles the request for the redemption, delegates the execution and returns the response. func (m msgServer) Redeem(goCtx context.Context, msg *metoken.MsgRedeem) (*metoken.MsgRedeemResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - k := m.kb.Keeper(&ctx) - - if err := msg.ValidateBasic(); err != nil { + ctx, err := sdkutil.StartMsg(goCtx, msg) + if err != nil { return nil, err } @@ -80,6 +76,7 @@ func (m msgServer) Redeem(goCtx context.Context, msg *metoken.MsgRedeem) (*metok return nil, err } + k := m.kb.Keeper(&ctx) resp, err := k.redeem(userAddr, msg.Metoken, msg.AssetDenom) if err != nil { return nil, err @@ -118,12 +115,12 @@ func (m msgServer) GovSetParams(goCtx context.Context, msg *metoken.MsgGovSetPar *metoken.MsgGovSetParamsResponse, error, ) { - ctx := sdk.UnwrapSDKContext(goCtx) - if err := msg.ValidateBasic(); err != nil { + ctx, err := sdkutil.StartMsg(goCtx, msg) + if err != nil { return nil, err } - if err := m.kb.Keeper(&ctx).SetParams(msg.Params); err != nil { + if err = m.kb.Keeper(&ctx).SetParams(msg.Params); err != nil { return nil, err } @@ -135,15 +132,14 @@ func (m msgServer) GovUpdateRegistry( goCtx context.Context, msg *metoken.MsgGovUpdateRegistry, ) (*metoken.MsgGovUpdateRegistryResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - k := m.kb.Keeper(&ctx) - - byEmergencyGroup, err := checkers.EmergencyGroupAuthority(msg.Authority, k.ugov(&ctx)) + ctx, err := sdkutil.StartMsg(goCtx, msg) if err != nil { return nil, err } - if err := msg.ValidateBasic(); err != nil { + k := m.kb.Keeper(&ctx) + byEmergencyGroup, err := checkers.EmergencyGroupAuthority(msg.Authority, k.ugov(&ctx)) + if err != nil { return nil, err } From 7f6db2fbadeab0ce73d82db35a865a7ad0e9adc2 Mon Sep 17 00:00:00 2001 From: Egor Kostetskiy Date: Tue, 26 Sep 2023 13:08:04 -0300 Subject: [PATCH 3/8] fix --- x/metoken/keeper/metoken.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/metoken/keeper/metoken.go b/x/metoken/keeper/metoken.go index d62454f8ea..5d39d7ced5 100644 --- a/x/metoken/keeper/metoken.go +++ b/x/metoken/keeper/metoken.go @@ -152,7 +152,7 @@ func (k Keeper) addIndexes( } } - checkers.MergeErrors(indexErrs, k.validateInLeverage(index)) + indexErrs = checkers.MergeErrors(indexErrs, k.validateInLeverage(index)) if len(indexErrs) > 0 { allErrs = append(allErrs, indexErrs...) @@ -248,7 +248,7 @@ func (k Keeper) updateIndexes( } } - checkers.MergeErrors(indexErrs, k.validateInLeverage(index)) + indexErrs = checkers.MergeErrors(indexErrs, k.validateInLeverage(index)) if len(indexErrs) > 0 { allErrs = append(allErrs, indexErrs...) From 5eec041984261b42c8c03b9b21c6aac9fcf967cf Mon Sep 17 00:00:00 2001 From: Egor Kostetskiy Date: Tue, 26 Sep 2023 13:18:10 -0300 Subject: [PATCH 4/8] lint --- x/metoken/keeper/metoken_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/metoken/keeper/metoken_test.go b/x/metoken/keeper/metoken_test.go index 71dd47951e..81466905fd 100644 --- a/x/metoken/keeper/metoken_test.go +++ b/x/metoken/keeper/metoken_test.go @@ -50,7 +50,7 @@ func TestIndex_AddAndUpdate(t *testing.T) { addDuplicatedAsset := mocks.StableIndex("me/Test") egUpdateFailure := mocks.StableIndex(mocks.MeUSDDenom) - egUpdateFailure.Exponent -= 1 + egUpdateFailure.Exponent-- egUpdateFailure.Fee.BalancedFee = sdk.MustNewDecFromStr("0.3") egUpdateFailure.MaxSupply = egUpdateFailure.MaxSupply.Add(sdkmath.NewInt(1000)) egUpdateFailure.AcceptedAssets = append( From 4df85ace8094f5ca4cb73adc7196d12a79abe6d7 Mon Sep 17 00:00:00 2001 From: Egor Kostetskiy Date: Tue, 26 Sep 2023 13:24:16 -0300 Subject: [PATCH 5/8] lint --- x/metoken/keeper/msg_server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/metoken/keeper/msg_server.go b/x/metoken/keeper/msg_server.go index 3e26404fb0..f31cc1d6c7 100644 --- a/x/metoken/keeper/msg_server.go +++ b/x/metoken/keeper/msg_server.go @@ -33,7 +33,7 @@ func (m msgServer) Swap(goCtx context.Context, msg *metoken.MsgSwap) (*metoken.M if err != nil { return nil, err } - + k := m.kb.Keeper(&ctx) resp, err := k.swap(userAddr, msg.MetokenDenom, msg.Asset) if err != nil { From 6b8e4942f31e429fe1e3e1e65b322269c5abffe0 Mon Sep 17 00:00:00 2001 From: Egor Kostetskiy Date: Wed, 27 Sep 2023 11:23:10 -0300 Subject: [PATCH 6/8] pr comments2 --- util/checkers/error.go | 2 +- x/metoken/keeper/metoken.go | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/util/checkers/error.go b/util/checkers/error.go index 76ba797803..b5910a77ab 100644 --- a/util/checkers/error.go +++ b/util/checkers/error.go @@ -1,6 +1,6 @@ package checkers -func MergeErrors(errs1, errs2 []error) []error { +func Merge(errs1, errs2 []error) []error { if len(errs2) > 0 { return append(errs1, errs2...) } diff --git a/x/metoken/keeper/metoken.go b/x/metoken/keeper/metoken.go index 5d39d7ced5..2a406a2545 100644 --- a/x/metoken/keeper/metoken.go +++ b/x/metoken/keeper/metoken.go @@ -5,13 +5,12 @@ import ( "fmt" "time" - "github.com/umee-network/umee/v6/util/checkers" - sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/umee-network/umee/v6/util/checkers" "github.com/umee-network/umee/v6/util/store" "github.com/umee-network/umee/v6/x/metoken" ) @@ -94,16 +93,16 @@ func (k Keeper) UpdateIndexes( errs = append(errs, sdkerrors.ErrInvalidRequest.Wrapf("Emergency Group cannot register new indexes")) } - errs = checkers.MergeErrors(errs, validateEGIndexUpdate(updateIndexes, registeredIndexes)) + errs = checkers.Merge(errs, validateEGIndexUpdate(updateIndexes, registeredIndexes)) if len(errs) > 0 { return errors.Join(errs...) } } - errs = checkers.MergeErrors(errs, k.addIndexes(addIndexes, registeredIndexes, registeredAssets)) + errs = checkers.Merge(errs, k.addIndexes(addIndexes, registeredIndexes, registeredAssets)) - errs = checkers.MergeErrors(errs, k.updateIndexes(updateIndexes, registeredIndexes, registeredAssets)) + errs = checkers.Merge(errs, k.updateIndexes(updateIndexes, registeredIndexes, registeredAssets)) if len(errs) > 0 { return errors.Join(errs...) @@ -148,11 +147,10 @@ func (k Keeper) addIndexes( aa.Denom, ), ) - continue } } - indexErrs = checkers.MergeErrors(indexErrs, k.validateInLeverage(index)) + indexErrs = checkers.Merge(indexErrs, k.validateInLeverage(index)) if len(indexErrs) > 0 { allErrs = append(allErrs, indexErrs...) @@ -248,7 +246,7 @@ func (k Keeper) updateIndexes( } } - indexErrs = checkers.MergeErrors(indexErrs, k.validateInLeverage(index)) + indexErrs = checkers.Merge(indexErrs, k.validateInLeverage(index)) if len(indexErrs) > 0 { allErrs = append(allErrs, indexErrs...) From 824377e192440e66f23a81b035a7f9750e95d76a Mon Sep 17 00:00:00 2001 From: Egor Kostetskiy Date: Wed, 27 Sep 2023 11:40:08 -0300 Subject: [PATCH 7/8] pr comments3 --- x/metoken/keeper/metoken.go | 69 ++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/x/metoken/keeper/metoken.go b/x/metoken/keeper/metoken.go index 2a406a2545..b3c49d5c77 100644 --- a/x/metoken/keeper/metoken.go +++ b/x/metoken/keeper/metoken.go @@ -71,11 +71,7 @@ func (k Keeper) setNextInterestClaimTime(nextInterestClaimTime time.Time) { } // UpdateIndexes registers `addIndexes` and processes `updateIndexes` to update existing indexes. -func (k Keeper) UpdateIndexes( - addIndexes []metoken.Index, - updateIndexes []metoken.Index, - byEmergencyGroup bool, -) error { +func (k Keeper) UpdateIndexes(toAdd, toUpdate []metoken.Index, byEmergencyGroup bool) error { registry := k.GetAllRegisteredIndexes() registeredIndexes := make(map[string]metoken.Index) @@ -89,26 +85,21 @@ func (k Keeper) UpdateIndexes( var errs []error if byEmergencyGroup { - if len(addIndexes) > 0 { + if len(toAdd) > 0 { errs = append(errs, sdkerrors.ErrInvalidRequest.Wrapf("Emergency Group cannot register new indexes")) } - errs = checkers.Merge(errs, validateEGIndexUpdate(updateIndexes, registeredIndexes)) + errs = checkers.Merge(errs, validateEGIndexUpdate(toUpdate, registeredIndexes)) if len(errs) > 0 { return errors.Join(errs...) } } - errs = checkers.Merge(errs, k.addIndexes(addIndexes, registeredIndexes, registeredAssets)) + errs = checkers.Merge(errs, k.addIndexes(toAdd, registeredIndexes, registeredAssets)) + errs = checkers.Merge(errs, k.updateIndexes(toUpdate, registeredIndexes, registeredAssets)) - errs = checkers.Merge(errs, k.updateIndexes(updateIndexes, registeredIndexes, registeredAssets)) - - if len(errs) > 0 { - return errors.Join(errs...) - } - - return nil + return errors.Join(errs...) } // addIndexes handles addition of the indexes from the request along with their validations. @@ -139,17 +130,7 @@ func (k Keeper) addIndexes( ) } - for _, aa := range index.AcceptedAssets { - if _, present := registeredAssets[aa.Denom]; present { - indexErrs = append( - indexErrs, sdkerrors.ErrInvalidRequest.Wrapf( - "add: asset %s is already accepted in another index", - aa.Denom, - ), - ) - } - } - + indexErrs = checkers.Merge(indexErrs, checkDuplicatedAssets(index.AcceptedAssets, registeredAssets, "")) indexErrs = checkers.Merge(indexErrs, k.validateInLeverage(index)) if len(indexErrs) > 0 { @@ -207,16 +188,10 @@ func (k Keeper) updateIndexes( continue } - for _, aa := range index.AcceptedAssets { - if indexDenom, present := registeredAssets[aa.Denom]; present && indexDenom != index.Denom { - indexErrs = append( - indexErrs, sdkerrors.ErrInvalidRequest.Wrapf( - "add: asset %s is already accepted in another index", - aa.Denom, - ), - ) - } - } + indexErrs = checkers.Merge( + indexErrs, + checkDuplicatedAssets(index.AcceptedAssets, registeredAssets, index.Denom), + ) if oldIndex.Exponent != index.Exponent { balances, err := k.IndexBalances(index.Denom) @@ -283,6 +258,28 @@ func (k Keeper) updateIndexes( return nil } +func checkDuplicatedAssets( + assets []metoken.AcceptedAsset, + registeredAssets map[string]string, + indexDenom string, +) []error { + var errs []error + for _, aa := range assets { + if d, present := registeredAssets[aa.Denom]; present && (len(indexDenom) == 0 || d != indexDenom) { + errs = append( + errs, + sdkerrors.ErrInvalidRequest.Wrapf( + "add: asset %s is already accepted in another index %s", + aa.Denom, + d, + ), + ) + } + } + + return errs +} + // validateEGIndexUpdate checks if emergency group can perform updates. func validateEGIndexUpdate(indexes []metoken.Index, registeredIndexes map[string]metoken.Index) []error { var errs []error From d1b99c5622b1b93bf25e9c63ac915aca8dd7f0a6 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 27 Sep 2023 17:48:25 +0200 Subject: [PATCH 8/8] Update x/metoken/keeper/metoken.go --- x/metoken/keeper/metoken.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/metoken/keeper/metoken.go b/x/metoken/keeper/metoken.go index b3c49d5c77..63f974c747 100644 --- a/x/metoken/keeper/metoken.go +++ b/x/metoken/keeper/metoken.go @@ -70,7 +70,7 @@ func (k Keeper) setNextInterestClaimTime(nextInterestClaimTime time.Time) { store.SetTimeMs(k.store, keyPrefixNextInterestClaimTime, nextInterestClaimTime) } -// UpdateIndexes registers `addIndexes` and processes `updateIndexes` to update existing indexes. +// UpdateIndexes registers `toAdd` and processes `toUpdate` to update existing indexes. func (k Keeper) UpdateIndexes(toAdd, toUpdate []metoken.Index, byEmergencyGroup bool) error { registry := k.GetAllRegisteredIndexes()