From dc2905a269b0fbce3010b68d27f67cee3987134c Mon Sep 17 00:00:00 2001 From: Arham Chordia Date: Fri, 31 Jan 2025 15:32:20 +0530 Subject: [PATCH] removing submodule dependent on ICS to figure out later. --- proto/buf.gen.yaml | 8 +- x/claimsmanager/keeper/submodule.go | 16 -- x/claimsmanager/keeper/submodule_liquid.go | 87 ------ x/claimsmanager/keeper/submodule_osmosis.go | 164 ------------ x/claimsmanager/keeper/submodule_osmosiscl.go | 162 ------------ x/claimsmanager/keeper/submodule_umee.go | 247 ------------------ 6 files changed, 4 insertions(+), 680 deletions(-) delete mode 100644 x/claimsmanager/keeper/submodule.go delete mode 100644 x/claimsmanager/keeper/submodule_liquid.go delete mode 100644 x/claimsmanager/keeper/submodule_osmosis.go delete mode 100644 x/claimsmanager/keeper/submodule_osmosiscl.go delete mode 100644 x/claimsmanager/keeper/submodule_umee.go diff --git a/proto/buf.gen.yaml b/proto/buf.gen.yaml index ca72da10e..d0b950da0 100644 --- a/proto/buf.gen.yaml +++ b/proto/buf.gen.yaml @@ -6,7 +6,7 @@ plugins: - plugins=grpc,Mgoogle/protobuf/any.proto=github.com/cosmos/cosmos-sdk/codec/types, - name: grpc-gateway out: .. - - name: swagger - out: ../tmp-swagger-gen - opt: - - simple_operation_ids=true +# - name: swagger +# out: ../tmp-swagger-gen +# opt: +# - simple_operation_ids=true diff --git a/x/claimsmanager/keeper/submodule.go b/x/claimsmanager/keeper/submodule.go deleted file mode 100644 index 868423dd3..000000000 --- a/x/claimsmanager/keeper/submodule.go +++ /dev/null @@ -1,16 +0,0 @@ -package keeper - -import ( - "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/quicksilver-zone/quicksilver/x/claimsmanager/types" -) - -// Submodule defines the interface for for tracking off-chain qAssets with -// regards to participation rewards claims. -type Submodule interface { - Hooks(ctx sdk.Context, keeper *Keeper) - ValidateClaim(ctx sdk.Context, k *Keeper, msg *types.MsgSubmitClaim) (math.Int, error) -} diff --git a/x/claimsmanager/keeper/submodule_liquid.go b/x/claimsmanager/keeper/submodule_liquid.go deleted file mode 100644 index 12af8f15d..000000000 --- a/x/claimsmanager/keeper/submodule_liquid.go +++ /dev/null @@ -1,87 +0,0 @@ -package keeper - -import ( - "encoding/json" - "errors" - "fmt" - - "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/bech32" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - - "github.com/quicksilver-zone/quicksilver/utils" - "github.com/quicksilver-zone/quicksilver/x/claimsmanager/types" -) - -type LiquidTokensModule struct{} - -var _ Submodule = &LiquidTokensModule{} - -func (*LiquidTokensModule) Hooks(_ sdk.Context, _ *Keeper) { -} - -func (*LiquidTokensModule) ValidateClaim(ctx sdk.Context, k *Keeper, msg *types.MsgSubmitClaim) (math.Int, error) { - // message - // check denom is valid vs allowed - - zone, ok := k.icsKeeper.GetZone(ctx, msg.Zone) - if !ok { - return sdk.ZeroInt(), fmt.Errorf("unable to find registered zone for chain id: %s", msg.Zone) - } - - _, addr, err := bech32.DecodeAndConvert(msg.UserAddress) - if err != nil { - return sdk.ZeroInt(), err - } - - amount := sdk.ZeroInt() - keyCache := make(map[string]bool) - - for _, proof := range msg.Proofs { - if _, found := keyCache[string(proof.Key)]; found { - continue - } - keyCache[string(proof.Key)] = true - - if proof.Data == nil { - continue - } - - // DenomFromRequestKey will error if the user address does not match the address in the key - // or if the denom found is not valid. - denom, err := utils.DenomFromRequestKey(proof.Key, addr) - if err != nil { - // check for mapped address for this user from SrcZone. - mappedAddr, found := k.icsKeeper.GetLocalAddressMap(ctx, addr, msg.SrcZone) - if found { - denom, err = utils.DenomFromRequestKey(proof.Key, mappedAddr) - if err != nil { - return sdk.ZeroInt(), errors.New("not a valid proof for submitting user or mapped account") - } - } else { - return sdk.ZeroInt(), errors.New("not a valid proof for submitting user") - } - } - - data, found := k.GetProtocolData(ctx, types.ProtocolDataTypeLiquidToken, fmt.Sprintf("%s_%s", msg.SrcZone, denom)) - if !found { - // we don't have a record for this denom, but this is okay, we don't want to submit records for every ibc denom. - continue - } - denomData := types.LiquidAllowedDenomProtocolData{} - err = json.Unmarshal(data.Data, &denomData) - if err != nil { - return sdk.ZeroInt(), err - } - if denomData.QAssetDenom == zone.LocalDenom && denomData.IbcDenom == denom { - coin, err := bankkeeper.UnmarshalBalanceCompat(k.cdc, proof.Data, denomData.IbcDenom) - if err != nil { - return sdk.ZeroInt(), err - } - amount = amount.Add(coin.Amount) - } - } - return amount, nil -} diff --git a/x/claimsmanager/keeper/submodule_osmosis.go b/x/claimsmanager/keeper/submodule_osmosis.go deleted file mode 100644 index 2c47b4333..000000000 --- a/x/claimsmanager/keeper/submodule_osmosis.go +++ /dev/null @@ -1,164 +0,0 @@ -package keeper - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - participationrewardskeeper "github.com/quicksilver-zone/quicksilver/x/participationrewards/keeper" - "strconv" - "strings" - "time" - - "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/bech32" - "github.com/cosmos/cosmos-sdk/x/bank/keeper" - - osmosistypes "github.com/quicksilver-zone/quicksilver/third-party-chains/osmosis-types" - osmolockup "github.com/quicksilver-zone/quicksilver/third-party-chains/osmosis-types/lockup" - "github.com/quicksilver-zone/quicksilver/utils" - "github.com/quicksilver-zone/quicksilver/utils/addressutils" - "github.com/quicksilver-zone/quicksilver/x/claimsmanager/types" -) - -type OsmosisModule struct{} - -var _ Submodule = &OsmosisModule{} - -func (m *OsmosisModule) Hooks(ctx sdk.Context, k *Keeper) { - // osmosis params - params, found := k.GetProtocolData(ctx, types.ProtocolDataTypeOsmosisParams, types.OsmosisParamsKey) - if !found { - k.Logger(ctx).Error("unable to query osmosisparams in OsmosisModule hook") - return - } - - paramsData := types.OsmosisParamsProtocolData{} - if err := json.Unmarshal(params.Data, ¶msData); err != nil { - k.Logger(ctx).Error("unable to unmarshal osmosisparams in OsmosisModule hook", "error", err) - return - } - - data, found := k.GetProtocolData(ctx, types.ProtocolDataTypeConnection, paramsData.ChainID) - if !found { - k.Logger(ctx).Error(fmt.Sprintf("unable to query connection/%s in OsmosisModule hook", paramsData.ChainID)) - return - } - - connectionData := types.ConnectionProtocolData{} - if err := json.Unmarshal(data.Data, &connectionData); err != nil { - k.Logger(ctx).Error(fmt.Sprintf("unable to unmarshal connection/%s in OsmosisModule hook", paramsData.ChainID)) - return - } - - k.IteratePrefixedProtocolDatas(ctx, types.GetPrefixProtocolDataKey(types.ProtocolDataTypeOsmosisPool), func(idx int64, _ []byte, data types.ProtocolData) bool { - ipool, err := types.UnmarshalProtocolData(types.ProtocolDataTypeOsmosisPool, data.Data) - if err != nil { - return false - } - pool, _ := ipool.(*types.OsmosisPoolProtocolData) - - // update pool datas - k.IcqKeeper.MakeRequest( - ctx, - connectionData.ConnectionID, - connectionData.ChainID, - "store/gamm/key", - m.GetKeyPrefixPools(pool.PoolID), - sdk.NewInt(-1), - types.ModuleName, - participationrewardskeeper.OsmosisPoolUpdateCallbackID, - 0, - ) // query pool data - return false - }) -} - -func (*OsmosisModule) ValidateClaim(ctx sdk.Context, k *Keeper, msg *types.MsgSubmitClaim) (math.Int, error) { - amount := sdk.ZeroInt() - var lock osmolockup.PeriodLock - - addr, err := addressutils.AccAddressFromBech32(msg.UserAddress, "") - if err != nil { - return sdk.ZeroInt(), err - } - - keyCache := make(map[string]bool) - - for _, proof := range msg.Proofs { - if _, found := keyCache[string(proof.Key)]; found { - continue - } - keyCache[string(proof.Key)] = true - - if proof.Data == nil { - continue - } - - if proof.ProofType == types.ProofTypeBank { - poolDenom, err := utils.DenomFromRequestKey(proof.Key, addr) - if err != nil { - // check for mapped address for this user from SrcZone. - mappedAddr, found := k.icsKeeper.GetLocalAddressMap(ctx, addr, msg.SrcZone) - if found { - poolDenom, err = utils.DenomFromRequestKey(proof.Key, mappedAddr) - if err != nil { - return sdk.ZeroInt(), errors.New("not a valid proof for submitting user or mapped account") - } - } else { - return sdk.ZeroInt(), errors.New("not a valid proof for submitting user") - } - } - - coin, err := keeper.UnmarshalBalanceCompat(k.cdc, proof.Data, poolDenom) - if err != nil { - return sdk.ZeroInt(), err - } - poolID, err := strconv.Atoi(poolDenom[strings.LastIndex(poolDenom, "/")+1:]) - if err != nil { - return sdk.ZeroInt(), err - } - lock = osmolockup.NewPeriodLock(uint64(poolID), addr, addr.String(), time.Hour, time.Time{}, sdk.NewCoins(coin)) //nolint:gosec - } else { - lock = osmolockup.PeriodLock{} - err := k.cdc.Unmarshal(proof.Data, &lock) - if err != nil { - return sdk.ZeroInt(), err - } - - _, lockupOwner, err := bech32.DecodeAndConvert(lock.Owner) - if err != nil { - return sdk.ZeroInt(), err - } - - if !bytes.Equal(lockupOwner, addr) { - mappedAddr, found := k.icsKeeper.GetLocalAddressMap(ctx, addr, msg.SrcZone) - if !found || !bytes.Equal(lockupOwner, mappedAddr) { - return sdk.ZeroInt(), errors.New("not a valid proof for submitting user or mapped account") - } - } - } - - denom, found := k.ApplicableDenomForZone(ctx, msg.Zone) - if !found { - return math.ZeroInt(), errors.New("no applicable denom found for zone") - } - - sdkAmount, err := osmosistypes.DetermineApplicableTokensInPool(ctx, k, lock, msg.Zone, denom) - if err != nil { - return sdk.ZeroInt(), err - } - - if sdkAmount.IsNil() || sdkAmount.IsNegative() { - return sdk.ZeroInt(), errors.New("unexpected amount") - } - amount = amount.Add(sdkAmount) - } - return amount, nil -} - -func (*OsmosisModule) GetKeyPrefixPools(poolID uint64) []byte { - return append([]byte{0x02}, sdk.Uint64ToBigEndian(poolID)...) -} diff --git a/x/claimsmanager/keeper/submodule_osmosiscl.go b/x/claimsmanager/keeper/submodule_osmosiscl.go deleted file mode 100644 index 885ea6058..000000000 --- a/x/claimsmanager/keeper/submodule_osmosiscl.go +++ /dev/null @@ -1,162 +0,0 @@ -package keeper - -import ( - "bytes" - "cosmossdk.io/math" - "encoding/json" - "errors" - "fmt" - participationrewardskeeper "github.com/quicksilver-zone/quicksilver/x/participationrewards/keeper" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/bech32" - - osmosistypes "github.com/quicksilver-zone/quicksilver/third-party-chains/osmosis-types" - osmocl "github.com/quicksilver-zone/quicksilver/third-party-chains/osmosis-types/concentrated-liquidity" - osmoclmodel "github.com/quicksilver-zone/quicksilver/third-party-chains/osmosis-types/concentrated-liquidity/model" - "github.com/quicksilver-zone/quicksilver/utils/addressutils" - "github.com/quicksilver-zone/quicksilver/x/claimsmanager/types" -) - -type OsmosisClModule struct{} - -var _ Submodule = &OsmosisClModule{} - -func (m *OsmosisClModule) Hooks(ctx sdk.Context, k *Keeper) { - // osmosis params - params, found := k.GetProtocolData(ctx, types.ProtocolDataTypeOsmosisParams, types.OsmosisParamsKey) - if !found { - k.Logger(ctx).Error("unable to query osmosisparams in OsmosisModule hook") - return - } - - paramsData := types.OsmosisParamsProtocolData{} - if err := json.Unmarshal(params.Data, ¶msData); err != nil { - k.Logger(ctx).Error("unable to unmarshal osmosisparams in OsmosisModule hook", "error", err) - return - } - - data, found := k.GetProtocolData(ctx, types.ProtocolDataTypeConnection, paramsData.ChainID) - if !found { - k.Logger(ctx).Error(fmt.Sprintf("unable to query connection/%s in OsmosisModule hook", paramsData.ChainID)) - return - } - - connectionData := types.ConnectionProtocolData{} - if err := json.Unmarshal(data.Data, &connectionData); err != nil { - k.Logger(ctx).Error(fmt.Sprintf("unable to unmarshal connection/%s in OsmosisModule hook", paramsData.ChainID)) - return - } - - k.IteratePrefixedProtocolDatas(ctx, types.GetPrefixProtocolDataKey(types.ProtocolDataTypeOsmosisCLPool), func(idx int64, _ []byte, data types.ProtocolData) bool { - ipool, err := types.UnmarshalProtocolData(types.ProtocolDataTypeOsmosisCLPool, data.Data) - if err != nil { - return false - } - pool, _ := ipool.(*types.OsmosisClPoolProtocolData) - - // update pool datas - k.IcqKeeper.MakeRequest( - ctx, - connectionData.ConnectionID, - connectionData.ChainID, - "store/concentratedliquidity/key", - m.KeyPool(pool.PoolID), - sdk.NewInt(-1), - types.ModuleName, - participationrewardskeeper.OsmosisClPoolUpdateCallbackID, - 0, - ) // query pool data - return false - }) -} - -func (*OsmosisClModule) ValidateClaim(ctx sdk.Context, k *Keeper, msg *types.MsgSubmitClaim) (math.Int, error) { - claimAmount := math.ZeroInt() - var position osmoclmodel.Position - - addr, err := addressutils.AccAddressFromBech32(msg.UserAddress, "") - if err != nil { - return math.ZeroInt(), err - } - - keyCache := make(map[string]bool) - - for _, proof := range msg.Proofs { - if _, found := keyCache[string(proof.Key)]; found { - continue - } - keyCache[string(proof.Key)] = true - - if proof.Data == nil { - continue - } - - position = osmoclmodel.Position{} - err := k.cdc.Unmarshal(proof.Data, &position) - if err != nil { - return math.ZeroInt(), err - } - - _, lockupOwner, err := bech32.DecodeAndConvert(position.Address) - if err != nil { - return math.ZeroInt(), err - } - - if !bytes.Equal(lockupOwner, addr) { - mappedAddr, found := k.icsKeeper.GetLocalAddressMap(ctx, addr, msg.SrcZone) - if !found || !bytes.Equal(lockupOwner, mappedAddr) { - return math.ZeroInt(), errors.New("not a valid proof for submitting user or mapped account") - } - } - - denom, found := k.ApplicableDenomForZone(ctx, msg.Zone) - if !found { - return math.ZeroInt(), errors.New("no applicable denom found for zone") - } - - sdkAmount, err := osmosistypes.DetermineApplicableTokensInClPool(ctx, k, position, msg.Zone, denom) - if err != nil { - return math.ZeroInt(), err - } - - if sdkAmount.IsNil() || sdkAmount.IsNegative() { - return math.ZeroInt(), errors.New("unexpected amount") - } - claimAmount = claimAmount.Add(sdkAmount) - } - return claimAmount, nil -} - -func (*OsmosisClModule) KeyPool(poolID uint64) []byte { - return osmocl.KeyPool(poolID) -} - -func (k *Keeper) ApplicableDenomForZone(ctx sdk.Context, chainID string) (denom string, found bool) { - zone, found := k.icsKeeper.GetZone(ctx, chainID) - if !found { - return "", false - } - - params, found := k.GetProtocolData(ctx, types.ProtocolDataTypeOsmosisParams, types.OsmosisParamsKey) - if !found { - return "", false - } - - paramsData := types.OsmosisParamsProtocolData{} - if err := json.Unmarshal(params.Data, ¶msData); err != nil { - return "", false - } - - k.IteratePrefixedProtocolDatas(ctx, types.GetPrefixProtocolDataKey(types.ProtocolDataTypeLiquidToken), func(idx int64, key []byte, data types.ProtocolData) bool { - liquidToken, _ := types.UnmarshalProtocolData(types.ProtocolDataTypeLiquidToken, data.Data) - liquidTokenData := liquidToken.(*types.LiquidAllowedDenomProtocolData) - if liquidTokenData.ChainID == paramsData.ChainID && liquidTokenData.QAssetDenom == zone.LocalDenom { - found = true - denom = liquidTokenData.IbcDenom - return true - } - return false - }) - return denom, found -} diff --git a/x/claimsmanager/keeper/submodule_umee.go b/x/claimsmanager/keeper/submodule_umee.go deleted file mode 100644 index c989f2200..000000000 --- a/x/claimsmanager/keeper/submodule_umee.go +++ /dev/null @@ -1,247 +0,0 @@ -package keeper - -import ( - "encoding/json" - "errors" - "fmt" - participationrewardskeeper "github.com/quicksilver-zone/quicksilver/x/participationrewards/keeper" - - "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - - umee "github.com/quicksilver-zone/quicksilver/third-party-chains/umee-types" - leveragetypes "github.com/quicksilver-zone/quicksilver/third-party-chains/umee-types/leverage/types" - "github.com/quicksilver-zone/quicksilver/utils" - "github.com/quicksilver-zone/quicksilver/utils/addressutils" - "github.com/quicksilver-zone/quicksilver/x/claimsmanager/types" - cmtypes "github.com/quicksilver-zone/quicksilver/x/claimsmanager/types" - icstypes "github.com/quicksilver-zone/quicksilver/x/interchainstaking/types" -) - -type UmeeModule struct{} - -var _ Submodule = &UmeeModule{} - -func (UmeeModule) Hooks(ctx sdk.Context, k *Keeper) { - // umee-types params - params, found := k.GetProtocolData(ctx, types.ProtocolDataTypeUmeeParams, types.UmeeParamsKey) - if !found { - k.Logger(ctx).Error("unable to query umeeparams in UmeeModule hook") - return - } - - paramsData := types.UmeeParamsProtocolData{} - if err := json.Unmarshal(params.Data, ¶msData); err != nil { - k.Logger(ctx).Error("unable to unmarshal umeeparams in UmeeModule hook", "error", err) - return - } - - data, found := k.GetProtocolData(ctx, types.ProtocolDataTypeConnection, paramsData.ChainID) - if !found { - k.Logger(ctx).Error(fmt.Sprintf("unable to query connection/%s in UmeeModule hook", paramsData.ChainID)) - return - } - - connectionData := types.ConnectionProtocolData{} - if err := json.Unmarshal(data.Data, &connectionData); err != nil { - k.Logger(ctx).Error(fmt.Sprintf("unable to unmarshal connection/%s in UmeeModule hook", paramsData.ChainID)) - return - } - - // umee-types reserves update - k.IteratePrefixedProtocolDatas(ctx, types.GetPrefixProtocolDataKey(types.ProtocolDataTypeUmeeReserves), func(idx int64, _ []byte, data types.ProtocolData) bool { - ireserves, err := types.UnmarshalProtocolData(types.ProtocolDataTypeUmeeReserves, data.Data) - if err != nil { - return false - } - reserves, _ := ireserves.(*types.UmeeReservesProtocolData) - - // update reserves - k.IcqKeeper.MakeRequest( - ctx, - connectionData.ConnectionID, - connectionData.ChainID, - "store/leverage/key", - leveragetypes.KeyReserveAmount(reserves.Denom), - sdk.NewInt(-1), - types.ModuleName, - participationrewardskeeper.UmeeReservesUpdateCallbackID, - 0, - ) // query reserve data - return false - }) - // umee-types interest scalar update - k.IteratePrefixedProtocolDatas(ctx, types.GetPrefixProtocolDataKey(types.ProtocolDataTypeUmeeInterestScalar), func(idx int64, _ []byte, data types.ProtocolData) bool { - iinterest, err := types.UnmarshalProtocolData(types.ProtocolDataTypeUmeeInterestScalar, data.Data) - if err != nil { - return false - } - interest, _ := iinterest.(*types.UmeeInterestScalarProtocolData) - - // update interest - k.IcqKeeper.MakeRequest( - ctx, - connectionData.ConnectionID, - connectionData.ChainID, - "store/leverage/key", - leveragetypes.KeyInterestScalar(interest.Denom), - sdk.NewInt(-1), - types.ModuleName, - participationrewardskeeper.UmeeInterestScalarUpdateCallbackID, - 0, - ) // query interest data - - return false - }) - // umee-types utoken supply update - k.IteratePrefixedProtocolDatas(ctx, types.GetPrefixProtocolDataKey(types.ProtocolDataTypeUmeeUTokenSupply), func(idx int64, _ []byte, data types.ProtocolData) bool { - isupply, err := types.UnmarshalProtocolData(types.ProtocolDataTypeUmeeUTokenSupply, data.Data) - if err != nil { - return false - } - supply, _ := isupply.(*types.UmeeUTokenSupplyProtocolData) - - // update utoken supply - k.IcqKeeper.MakeRequest( - ctx, - connectionData.ConnectionID, - connectionData.ChainID, - "store/leverage/key", - leveragetypes.KeyUTokenSupply(supply.Denom), - sdk.NewInt(-1), - types.ModuleName, - participationrewardskeeper.UmeeUTokenSupplyUpdateCallbackID, - 0, - ) // query utoken supply - - return false - }) - - // umee-types leverage module balance update - k.IteratePrefixedProtocolDatas(ctx, types.GetPrefixProtocolDataKey(types.ProtocolDataTypeUmeeLeverageModuleBalance), func(idx int64, _ []byte, data types.ProtocolData) bool { - ibalance, err := types.UnmarshalProtocolData(types.ProtocolDataTypeUmeeLeverageModuleBalance, data.Data) - if err != nil { - return false - } - balance, _ := ibalance.(*types.UmeeLeverageModuleBalanceProtocolData) - accountPrefix := banktypes.CreateAccountBalancesPrefix(authtypes.NewModuleAddress(leveragetypes.LeverageModuleName)) - - // update leverage module balance - k.IcqKeeper.MakeRequest( - ctx, - connectionData.ConnectionID, - connectionData.ChainID, - icstypes.BankStoreKey, - append(accountPrefix, balance.Denom...), - sdk.NewInt(-1), - types.ModuleName, - participationrewardskeeper.UmeeLeverageModuleBalanceUpdateCallbackID, - 0, - ) // query leverage module balance - - return false - }) - // umee-types total borrowed update - k.IteratePrefixedProtocolDatas(ctx, types.GetPrefixProtocolDataKey(types.ProtocolDataTypeUmeeTotalBorrows), func(idx int64, _ []byte, data types.ProtocolData) bool { - iborrows, err := types.UnmarshalProtocolData(types.ProtocolDataTypeUmeeTotalBorrows, data.Data) - if err != nil { - return false - } - borrows, _ := iborrows.(*types.UmeeTotalBorrowsProtocolData) - - // update total borrows for a denom - k.IcqKeeper.MakeRequest( - ctx, - connectionData.ConnectionID, - connectionData.ChainID, - "store/leverage/key", - leveragetypes.KeyAdjustedTotalBorrow(borrows.Denom), - sdk.NewInt(-1), - types.ModuleName, - participationrewardskeeper.UmeeTotalBorrowsUpdateCallbackID, - 0, - ) // query leverage module balance - - return false - }) -} - -func getDenomFromProof(proof *cmtypes.Proof, addr []byte) (string, error) { - denom, err := utils.DenomFromRequestKey(proof.Key, addr) - if err != nil { - return "", err - } - if proof.ProofType == types.ProofTypeLeverage { - denom = denom[:len(denom)-1] - } - return denom, err -} - -func (UmeeModule) ValidateClaim(ctx sdk.Context, k *Keeper, msg *types.MsgSubmitClaim) (math.Int, error) { - zone, ok := k.icsKeeper.GetZone(ctx, msg.Zone) - if !ok { - return sdk.ZeroInt(), fmt.Errorf("unable to find registered zone for chain id: %s", msg.Zone) - } - - addr, err := addressutils.AccAddressFromBech32(msg.UserAddress, "") - if err != nil { - return sdk.ZeroInt(), err - } - - amount := sdk.ZeroInt() - keyCache := make(map[string]bool) - - for _, proof := range msg.Proofs { - if _, found := keyCache[string(proof.Key)]; found { - continue - } - keyCache[string(proof.Key)] = true - - if proof.Data == nil { - continue - } - - udenom, err := getDenomFromProof(proof, addr) - if err != nil { - mappedAddr, found := k.icsKeeper.GetLocalAddressMap(ctx, addr, msg.SrcZone) - if found { - udenom, err = getDenomFromProof(proof, mappedAddr) - if err != nil { - return sdk.ZeroInt(), errors.New("not a valid proof for submitting user or mapped account") - } - } else { - return sdk.ZeroInt(), errors.New("not a valid proof for submitting user") - } - } - - denom := leveragetypes.ToTokenDenom(udenom) - - data, found := k.GetProtocolData(ctx, types.ProtocolDataTypeLiquidToken, fmt.Sprintf("%s_%s", msg.SrcZone, denom)) - if !found { - // we don't have a record for this denom, but this is okay, we don't want to submit records for every ibc denom. - continue - } - denomData := types.LiquidAllowedDenomProtocolData{} - err = json.Unmarshal(data.Data, &denomData) - if err != nil { - return sdk.ZeroInt(), err - } - if denomData.QAssetDenom == zone.LocalDenom && denomData.IbcDenom == denom { - uToken, err := bankkeeper.UnmarshalBalanceCompat(k.cdc, proof.Data, udenom) - if err != nil { - return sdk.ZeroInt(), err - } - token, err := umee.ExchangeUToken(ctx, uToken, k) - if err != nil { - return sdk.ZeroInt(), err - } - amount = amount.Add(token.Amount) - } - } - - return amount, err -}