From 484251ea499427d568cee91cb0f034fcd4f0cc50 Mon Sep 17 00:00:00 2001 From: Yaroms Date: Wed, 11 Sep 2024 17:35:38 +0300 Subject: [PATCH 01/27] wip --- proto/lavanet/lava/dualstaking/delegate.proto | 2 +- .../lava/dualstaking/delegator_reward.proto | 2 +- proto/lavanet/lava/dualstaking/genesis.proto | 4 +- testutil/common/tester.go | 21 +- utils/common/types/provider.go | 4 +- x/dualstaking/keeper/balance.go | 2 +- x/dualstaking/keeper/delegate.go | 390 ++++++------------ x/dualstaking/keeper/delegate_test.go | 52 +-- x/dualstaking/keeper/delegator_reward.go | 2 +- x/dualstaking/keeper/delegator_reward_test.go | 3 +- .../keeper/grpc_query_delegator_providers.go | 23 +- .../grpc_query_delegator_providers_test.go | 43 +- .../keeper/grpc_query_provider_delegators.go | 7 +- .../grpc_query_provider_delegators_test.go | 43 +- x/dualstaking/keeper/hooks_test.go | 26 +- x/dualstaking/keeper/keeper.go | 43 +- x/dualstaking/keeper/msg_server_delegate.go | 20 +- x/dualstaking/keeper/msg_server_redelegate.go | 13 - x/dualstaking/keeper/msg_server_unbond.go | 2 - x/dualstaking/types/delegate.go | 25 +- x/dualstaking/types/delegate.pb.go | 92 +---- x/dualstaking/types/delegator_reward.pb.go | 91 +--- x/dualstaking/types/genesis.pb.go | 155 ++----- x/dualstaking/types/genesis_test.go | 4 - x/dualstaking/types/keys.go | 24 +- x/dualstaking/types/message_delegate_test.go | 11 +- .../types/message_redelegate_test.go | 17 +- x/dualstaking/types/message_unbond_test.go | 11 +- x/pairing/keeper/cu_tracker_test.go | 10 +- x/pairing/keeper/delegator_rewards_test.go | 26 +- x/pairing/keeper/migrations.go | 2 +- .../keeper/msg_server_stake_provider_test.go | 12 +- x/pairing/keeper/pairing_test.go | 2 +- .../keeper/unresponsive_provider_test.go | 4 +- x/pairing/keeper/unstaking_test.go | 2 +- 35 files changed, 343 insertions(+), 847 deletions(-) diff --git a/proto/lavanet/lava/dualstaking/delegate.proto b/proto/lavanet/lava/dualstaking/delegate.proto index ea0d3986f1..8926254f89 100644 --- a/proto/lavanet/lava/dualstaking/delegate.proto +++ b/proto/lavanet/lava/dualstaking/delegate.proto @@ -7,8 +7,8 @@ import "gogoproto/gogo.proto"; import "cosmos/base/v1beta1/coin.proto"; message Delegation { + reserved 2; string provider = 1; // provider receives the delegated funds - string chainID = 2; // chainID to which staking delegate funds string delegator = 3; // delegator that owns the delegated funds cosmos.base.v1beta1.Coin amount = 4 [(gogoproto.nullable) = false]; int64 timestamp = 5; // Unix timestamp of the delegation (+ month) diff --git a/proto/lavanet/lava/dualstaking/delegator_reward.proto b/proto/lavanet/lava/dualstaking/delegator_reward.proto index 1145cf685e..c48be80aa6 100644 --- a/proto/lavanet/lava/dualstaking/delegator_reward.proto +++ b/proto/lavanet/lava/dualstaking/delegator_reward.proto @@ -7,9 +7,9 @@ import "gogoproto/gogo.proto"; import "cosmos/base/v1beta1/coin.proto"; message DelegatorReward { + reserved 3; string delegator = 1; string provider = 2; - string chain_id = 3; repeated cosmos.base.v1beta1.Coin amount = 4 [ (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", (gogoproto.nullable) = false diff --git a/proto/lavanet/lava/dualstaking/genesis.proto b/proto/lavanet/lava/dualstaking/genesis.proto index b6a97c3491..c06b04be49 100644 --- a/proto/lavanet/lava/dualstaking/genesis.proto +++ b/proto/lavanet/lava/dualstaking/genesis.proto @@ -12,8 +12,6 @@ option go_package = "github.com/lavanet/lava/v3/x/dualstaking/types"; // GenesisState defines the dualstaking module's genesis state. message GenesisState { Params params = 1 [(gogoproto.nullable) = false]; - lavanet.lava.fixationstore.GenesisState delegationsFS = 2 [(gogoproto.nullable) = false]; - lavanet.lava.fixationstore.GenesisState delegatorsFS = 3 [(gogoproto.nullable) = false]; - reserved 4; + reserved 2,3,4; repeated DelegatorReward delegator_reward_list = 5 [(gogoproto.nullable) = false]; } diff --git a/testutil/common/tester.go b/testutil/common/tester.go index 0a13df8d4f..941b2390d3 100644 --- a/testutil/common/tester.go +++ b/testutil/common/tester.go @@ -352,9 +352,8 @@ func (ts *Tester) VotePeriod() uint64 { return ts.Keepers.Conflict.VotePeriod(ts.Ctx) } -func (ts *Tester) ChangeDelegationTimestamp(provider, delegator, chainID string, block uint64, timestamp int64) error { - index := dualstakingtypes.DelegationKey(provider, delegator, chainID) - return ts.Keepers.Dualstaking.ChangeDelegationTimestampForTesting(ts.Ctx, index, block, timestamp) +func (ts *Tester) ChangeDelegationTimestamp(provider, delegator string, block uint64, timestamp int64) error { + return ts.Keepers.Dualstaking.ChangeDelegationTimestampForTesting(ts.Ctx, provider, delegator, timestamp) } // proposals, transactions, queries @@ -379,7 +378,6 @@ func (ts *Tester) TxProposalAddSpecs(specs ...spectypes.Spec) error { func (ts *Tester) TxDualstakingDelegate( creator string, provider string, - chainID string, amount sdk.Coin, ) (*dualstakingtypes.MsgDelegateResponse, error) { validator, _ := ts.GetAccount(VALIDATOR, 0) @@ -387,7 +385,6 @@ func (ts *Tester) TxDualstakingDelegate( creator, sdk.ValAddress(validator.Addr).String(), provider, - chainID, amount, ) } @@ -397,14 +394,13 @@ func (ts *Tester) TxDualstakingDelegateValidator( creator string, validator string, provider string, - chainID string, amount sdk.Coin, ) (*dualstakingtypes.MsgDelegateResponse, error) { msg := &dualstakingtypes.MsgDelegate{ Creator: creator, Validator: validator, Provider: provider, - ChainID: chainID, + ChainID: "chainID", Amount: amount, } return ts.Servers.DualstakingServer.Delegate(ts.GoCtx, msg) @@ -415,16 +411,14 @@ func (ts *Tester) TxDualstakingRedelegate( creator string, fromProvider string, toProvider string, - fromChainID string, - toChainID string, amount sdk.Coin, ) (*dualstakingtypes.MsgRedelegateResponse, error) { msg := &dualstakingtypes.MsgRedelegate{ Creator: creator, FromProvider: fromProvider, ToProvider: toProvider, - FromChainID: fromChainID, - ToChainID: toChainID, + FromChainID: "fromChainID", + ToChainID: "toChainID", Amount: amount, } return ts.Servers.DualstakingServer.Redelegate(ts.GoCtx, msg) @@ -434,7 +428,6 @@ func (ts *Tester) TxDualstakingRedelegate( func (ts *Tester) TxDualstakingUnbond( creator string, provider string, - chainID string, amount sdk.Coin, ) (*dualstakingtypes.MsgUnbondResponse, error) { validator, _ := ts.GetAccount(VALIDATOR, 0) @@ -442,7 +435,6 @@ func (ts *Tester) TxDualstakingUnbond( creator, sdk.ValAddress(validator.Addr).String(), provider, - chainID, amount, ) } @@ -452,14 +444,13 @@ func (ts *Tester) TxDualstakingUnbondValidator( creator string, validator string, provider string, - chainID string, amount sdk.Coin, ) (*dualstakingtypes.MsgUnbondResponse, error) { msg := &dualstakingtypes.MsgUnbond{ Creator: creator, Validator: validator, Provider: provider, - ChainID: chainID, + ChainID: "chainID", Amount: amount, } return ts.Servers.DualstakingServer.Unbond(ts.GoCtx, msg) diff --git a/utils/common/types/provider.go b/utils/common/types/provider.go index f83a43d723..7921bbbe1a 100644 --- a/utils/common/types/provider.go +++ b/utils/common/types/provider.go @@ -2,7 +2,5 @@ package types // empty provider consts const ( - EMPTY_PROVIDER = "empty_provider" - EMPTY_PROVIDER_CHAINID = "" - EMPTY_PROVIDER_CHAINID_STAR = "*" + EMPTY_PROVIDER = "empty_provider" ) diff --git a/x/dualstaking/keeper/balance.go b/x/dualstaking/keeper/balance.go index 92292835ab..3603279f3a 100644 --- a/x/dualstaking/keeper/balance.go +++ b/x/dualstaking/keeper/balance.go @@ -17,7 +17,7 @@ func (k Keeper) BalanceDelegator(ctx sdk.Context, delegator sdk.AccAddress) (int return providers, nil } else if diff.IsPositive() { // less provider delegations,a delegation operation was done, delegate to empty provider - err = k.delegate(ctx, delegator.String(), commontypes.EMPTY_PROVIDER, commontypes.EMPTY_PROVIDER_CHAINID, + err = k.delegate(ctx, delegator.String(), commontypes.EMPTY_PROVIDER, sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), diff)) if err != nil { return providers, err diff --git a/x/dualstaking/keeper/delegate.go b/x/dualstaking/keeper/delegate.go index 6e164e8c44..a6b559da81 100644 --- a/x/dualstaking/keeper/delegate.go +++ b/x/dualstaking/keeper/delegate.go @@ -18,64 +18,37 @@ package keeper // tracking the list of providers for a delegator, indexed by the delegator. import ( - "fmt" - + "cosmossdk.io/collections" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/lavanet/lava/v3/utils" commontypes "github.com/lavanet/lava/v3/utils/common/types" lavaslices "github.com/lavanet/lava/v3/utils/lavaslices" "github.com/lavanet/lava/v3/x/dualstaking/types" - epochstoragetypes "github.com/lavanet/lava/v3/x/epochstorage/types" "golang.org/x/exp/slices" ) // increaseDelegation increases the delegation of a delegator to a provider for a // given chain. It updates the fixation stores for both delegations and delegators, // and updates the (epochstorage) stake-entry. -func (k Keeper) increaseDelegation(ctx sdk.Context, delegator, provider, chainID string, amount sdk.Coin, nextEpoch uint64) error { - // get, update and append the delegation entry - var delegationEntry types.Delegation - index := types.DelegationKey(provider, delegator, chainID) - found := k.delegationFS.FindEntry(ctx, index, nextEpoch, &delegationEntry) - if !found { +func (k Keeper) increaseDelegation(ctx sdk.Context, delegator, provider string, amount sdk.Coin) error { + // get, update the delegation entry + delegation, err := k.delegations.Get(ctx, types.DelegationKey(provider, delegator)) + if err != nil { // new delegation (i.e. not increase of existing one) - delegationEntry = types.NewDelegation(delegator, provider, chainID, ctx.BlockTime(), k.stakingKeeper.BondDenom(ctx)) + delegation = types.NewDelegation(delegator, provider, ctx.BlockTime(), k.stakingKeeper.BondDenom(ctx)) } - delegationEntry.AddAmount(amount) + delegation.AddAmount(amount) - err := k.delegationFS.AppendEntry(ctx, index, nextEpoch, &delegationEntry) + err = k.delegations.Set(ctx, types.DelegationKey(provider, delegator), delegation) if err != nil { - // append should never fail here - return utils.LavaFormatError("critical: append delegation entry", err, - utils.Attribute{Key: "delegator", Value: delegationEntry.Delegator}, - utils.Attribute{Key: "provider", Value: delegationEntry.Provider}, - utils.Attribute{Key: "chainID", Value: delegationEntry.ChainID}, - ) - } - - // get, update and append the delegator entry - var delegatorEntry types.Delegator - index = types.DelegatorKey(delegator) - _ = k.delegatorFS.FindEntry(ctx, index, nextEpoch, &delegatorEntry) - - contains := delegatorEntry.AddProvider(provider) - if !contains { - err = k.delegatorFS.AppendEntry(ctx, index, nextEpoch, &delegatorEntry) - if err != nil { - // append should never fail here - return utils.LavaFormatError("critical: append delegator entry", err, - utils.Attribute{Key: "delegator", Value: delegator}, - utils.Attribute{Key: "provider", Value: provider}, - utils.Attribute{Key: "chainID", Value: chainID}, - ) - } + return err } if provider != commontypes.EMPTY_PROVIDER { // update the stake entry - return k.modifyStakeEntryDelegation(ctx, delegator, provider, chainID, amount, true) + return k.modifyStakeEntryDelegation(ctx, delegator, provider, amount, true) } return nil @@ -84,160 +57,95 @@ func (k Keeper) increaseDelegation(ctx sdk.Context, delegator, provider, chainID // decreaseDelegation decreases the delegation of a delegator to a provider for a // given chain. It updates the fixation stores for both delegations and delegators, // and updates the (epochstorage) stake-entry. -func (k Keeper) decreaseDelegation(ctx sdk.Context, delegator, provider, chainID string, amount sdk.Coin, nextEpoch uint64) error { +func (k Keeper) decreaseDelegation(ctx sdk.Context, delegator, provider string, amount sdk.Coin) error { // get, update and append the delegation entry - var delegationEntry types.Delegation - index := types.DelegationKey(provider, delegator, chainID) - found := k.delegationFS.FindEntry(ctx, index, nextEpoch, &delegationEntry) + delegation, found := k.GetDelegation(ctx, provider, delegator) if !found { return types.ErrDelegationNotFound } - if delegationEntry.Amount.IsLT(amount) { + if delegation.Amount.IsLT(amount) { return types.ErrInsufficientDelegation } - delegationEntry.SubAmount(amount) - - // if delegation now becomes zero, then remove this entry altogether; - // otherwise just append the new version (for next epoch). - if delegationEntry.Amount.IsZero() { - err := k.delegationFS.DelEntry(ctx, index, nextEpoch) - if err != nil { - // delete should never fail here - return utils.LavaFormatError("critical: delete delegation entry", err, - utils.Attribute{Key: "delegator", Value: delegator}, - utils.Attribute{Key: "provider", Value: provider}, - utils.Attribute{Key: "chainID", Value: chainID}, - ) - } - } else { - err := k.delegationFS.AppendEntry(ctx, index, nextEpoch, &delegationEntry) - if err != nil { - // append should never fail here - return utils.LavaFormatError("failed to update delegation entry", err, - utils.Attribute{Key: "delegator", Value: delegator}, - utils.Attribute{Key: "provider", Value: provider}, - utils.Attribute{Key: "chainID", Value: chainID}, - ) - } - } - - // get, update and append the delegator entry - var delegatorEntry types.Delegator - index = types.DelegatorKey(delegator) - found = k.delegatorFS.FindEntry(ctx, index, nextEpoch, &delegatorEntry) - if !found { - // we found the delegation above, so the delegator must exist as well - return utils.LavaFormatError("critical: delegator entry for delegation not found", - types.ErrDelegationNotFound, - utils.Attribute{Key: "delegator", Value: delegator}, - utils.Attribute{Key: "provider", Value: provider}, - utils.Attribute{Key: "chainID", Value: chainID}, - ) - } + delegation.SubAmount(amount) - // if delegation now becomes zero, then remove this provider from the delegator - // entry; and if the delegator entry becomes entry then remove it altogether. - // otherwise just append the new version (for next epoch). - if delegationEntry.Amount.IsZero() { - if len(k.GetAllProviderDelegatorDelegations(ctx, delegator, provider, nextEpoch)) == 0 { - delegatorEntry.DelProvider(provider) - if delegatorEntry.IsEmpty() { - err := k.delegatorFS.DelEntry(ctx, index, nextEpoch) - if err != nil { - // delete should never fail here - return utils.LavaFormatError("critical: delete delegator entry", err, - utils.Attribute{Key: "delegator", Value: delegator}, - utils.Attribute{Key: "provider", Value: provider}, - utils.Attribute{Key: "chainID", Value: chainID}, - ) - } - } else { - err := k.delegatorFS.AppendEntry(ctx, index, nextEpoch, &delegatorEntry) - if err != nil { - // append should never fail here - return utils.LavaFormatError("failed to update delegator entry", err, - utils.Attribute{Key: "delegator", Value: delegator}, - utils.Attribute{Key: "provider", Value: provider}, - utils.Attribute{Key: "chainID", Value: chainID}, - ) - } - } - } + err := k.SetDelegation(ctx, provider, delegator, delegation) + if err != nil { + return err } if provider != commontypes.EMPTY_PROVIDER { - return k.modifyStakeEntryDelegation(ctx, delegator, provider, chainID, amount, false) + return k.modifyStakeEntryDelegation(ctx, delegator, provider, amount, false) } return nil } // modifyStakeEntryDelegation modifies the (epochstorage) stake-entry of the provider for a chain based on the action (increase or decrease). -func (k Keeper) modifyStakeEntryDelegation(ctx sdk.Context, delegator, provider, chainID string, amount sdk.Coin, increase bool) (err error) { - stakeEntry, exists := k.epochstorageKeeper.GetStakeEntryCurrent(ctx, chainID, provider) - if !exists || provider != stakeEntry.Address { - if increase { - return epochstoragetypes.ErrProviderNotStaked - } - // For decrease, if the provider doesn't exist, return without error - return nil - } - - if delegator == stakeEntry.Vault { - if increase { - stakeEntry.Stake = stakeEntry.Stake.Add(amount) - } else { - stakeEntry.Stake, err = stakeEntry.Stake.SafeSub(amount) - if err != nil { - return fmt.Errorf("invalid or insufficient funds: %w", err) - } - } - } else { - if increase { - stakeEntry.DelegateTotal = stakeEntry.DelegateTotal.Add(amount) - } else { - stakeEntry.DelegateTotal, err = stakeEntry.DelegateTotal.SafeSub(amount) - if err != nil { - return fmt.Errorf("invalid or insufficient funds: %w", err) - } - } - } - - details := map[string]string{ - "provider_vault": stakeEntry.Vault, - "provider_provider": stakeEntry.Address, - "chain_id": stakeEntry.Chain, - "moniker": stakeEntry.Description.Moniker, - "description": stakeEntry.Description.String(), - "stake": stakeEntry.Stake.String(), - "effective_stake": stakeEntry.TotalStake().String() + stakeEntry.Stake.Denom, - } - - if stakeEntry.Stake.IsLT(k.GetParams(ctx).MinSelfDelegation) { - k.epochstorageKeeper.RemoveStakeEntryCurrent(ctx, chainID, stakeEntry.Address) - details["min_self_delegation"] = k.GetParams(ctx).MinSelfDelegation.String() - utils.LogLavaEvent(ctx, k.Logger(ctx), types.UnstakeFromUnbond, details, "unstaking provider due to unbond that lowered its stake below min self delegation") - return nil - } else if stakeEntry.TotalStake().LT(k.specKeeper.GetMinStake(ctx, chainID).Amount) { - details["min_spec_stake"] = k.specKeeper.GetMinStake(ctx, chainID).String() - utils.LogLavaEvent(ctx, k.Logger(ctx), types.FreezeFromUnbond, details, "freezing provider due to stake below min spec stake") - stakeEntry.Freeze() - } else if delegator == stakeEntry.Vault && stakeEntry.IsFrozen() && !stakeEntry.IsJailed(ctx.BlockTime().UTC().Unix()) { - stakeEntry.UnFreeze(k.epochstorageKeeper.GetCurrentNextEpoch(ctx) + 1) - } - - k.epochstorageKeeper.SetStakeEntryCurrent(ctx, stakeEntry) +func (k Keeper) modifyStakeEntryDelegation(ctx sdk.Context, delegator, provider string, amount sdk.Coin, increase bool) (err error) { + // todo yarom + + // stakeEntry, exists := k.epochstorageKeeper.GetStakeEntryCurrent(ctx, chainID, provider) + // if !exists || provider != stakeEntry.Address { + // if increase { + // return epochstoragetypes.ErrProviderNotStaked + // } + // // For decrease, if the provider doesn't exist, return without error + // return nil + // } + + // if delegator == stakeEntry.Vault { + // if increase { + // stakeEntry.Stake = stakeEntry.Stake.Add(amount) + // } else { + // stakeEntry.Stake, err = stakeEntry.Stake.SafeSub(amount) + // if err != nil { + // return fmt.Errorf("invalid or insufficient funds: %w", err) + // } + // } + // } else { + // if increase { + // stakeEntry.DelegateTotal = stakeEntry.DelegateTotal.Add(amount) + // } else { + // stakeEntry.DelegateTotal, err = stakeEntry.DelegateTotal.SafeSub(amount) + // if err != nil { + // return fmt.Errorf("invalid or insufficient funds: %w", err) + // } + // } + // } + + // details := map[string]string{ + // "provider_vault": stakeEntry.Vault, + // "provider_provider": stakeEntry.Address, + // "chain_id": stakeEntry.Chain, + // "moniker": stakeEntry.Description.Moniker, + // "description": stakeEntry.Description.String(), + // "stake": stakeEntry.Stake.String(), + // "effective_stake": stakeEntry.TotalStake().String() + stakeEntry.Stake.Denom, + // } + + // if stakeEntry.Stake.IsLT(k.GetParams(ctx).MinSelfDelegation) { + // k.epochstorageKeeper.RemoveStakeEntryCurrent(ctx, chainID, stakeEntry.Address) + // details["min_self_delegation"] = k.GetParams(ctx).MinSelfDelegation.String() + // utils.LogLavaEvent(ctx, k.Logger(ctx), types.UnstakeFromUnbond, details, "unstaking provider due to unbond that lowered its stake below min self delegation") + // return nil + // } else if stakeEntry.TotalStake().LT(k.specKeeper.GetMinStake(ctx, chainID).Amount) { + // details["min_spec_stake"] = k.specKeeper.GetMinStake(ctx, chainID).String() + // utils.LogLavaEvent(ctx, k.Logger(ctx), types.FreezeFromUnbond, details, "freezing provider due to stake below min spec stake") + // stakeEntry.Freeze() + // } else if delegator == stakeEntry.Vault && stakeEntry.IsFrozen() && !stakeEntry.IsJailed(ctx.BlockTime().UTC().Unix()) { + // stakeEntry.UnFreeze(k.epochstorageKeeper.GetCurrentNextEpoch(ctx) + 1) + // } + + // k.epochstorageKeeper.SetStakeEntryCurrent(ctx, stakeEntry) return nil } // delegate lets a delegator delegate an amount of coins to a provider. // (effective on next epoch) -func (k Keeper) delegate(ctx sdk.Context, delegator, provider, chainID string, amount sdk.Coin) error { - nextEpoch := k.epochstorageKeeper.GetCurrentNextEpoch(ctx) - +func (k Keeper) delegate(ctx sdk.Context, delegator, provider string, amount sdk.Coin) error { _, err := sdk.AccAddressFromBech32(delegator) if err != nil { return utils.LavaFormatWarning("invalid delegator address", err, @@ -257,17 +165,15 @@ func (k Keeper) delegate(ctx sdk.Context, delegator, provider, chainID string, a return utils.LavaFormatWarning("failed to delegate: coin validation failed", err, utils.Attribute{Key: "delegator", Value: delegator}, utils.Attribute{Key: "provider", Value: provider}, - utils.Attribute{Key: "chainID", Value: chainID}, ) } - err = k.increaseDelegation(ctx, delegator, provider, chainID, amount, nextEpoch) + err = k.increaseDelegation(ctx, delegator, provider, amount) if err != nil { return utils.LavaFormatWarning("failed to increase delegation", err, utils.Attribute{Key: "delegator", Value: delegator}, utils.Attribute{Key: "provider", Value: provider}, utils.Attribute{Key: "amount", Value: amount.String()}, - utils.Attribute{Key: "chainID", Value: chainID}, ) } @@ -277,19 +183,7 @@ func (k Keeper) delegate(ctx sdk.Context, delegator, provider, chainID string, a // Redelegate lets a delegator transfer its delegation between providers, but // without the funds being subject to unstakeHoldBlocks witholding period. // (effective on next epoch) -func (k Keeper) Redelegate(ctx sdk.Context, delegator, from, to, fromChainID, toChainID string, amount sdk.Coin) error { - _, foundFrom := k.specKeeper.GetSpec(ctx, fromChainID) - _, foundTo := k.specKeeper.GetSpec(ctx, toChainID) - if (!foundFrom && fromChainID != commontypes.EMPTY_PROVIDER_CHAINID) || - (!foundTo && toChainID != commontypes.EMPTY_PROVIDER_CHAINID) { - return utils.LavaFormatWarning("cannot redelegate with invalid chain IDs", fmt.Errorf("chain ID not found"), - utils.LogAttr("from_chain_id", fromChainID), - utils.LogAttr("to_chain_id", toChainID), - ) - } - - nextEpoch := k.epochstorageKeeper.GetCurrentNextEpoch(ctx) - +func (k Keeper) Redelegate(ctx sdk.Context, delegator, from, to string, amount sdk.Coin) error { if _, err := sdk.AccAddressFromBech32(delegator); err != nil { return utils.LavaFormatWarning("invalid delegator address", err, utils.Attribute{Key: "delegator", Value: delegator}, @@ -319,7 +213,7 @@ func (k Keeper) Redelegate(ctx sdk.Context, delegator, from, to, fromChainID, to ) } - err := k.increaseDelegation(ctx, delegator, to, toChainID, amount, nextEpoch) + err := k.increaseDelegation(ctx, delegator, to, amount) if err != nil { return utils.LavaFormatWarning("failed to increase delegation", err, utils.Attribute{Key: "delegator", Value: delegator}, @@ -328,7 +222,7 @@ func (k Keeper) Redelegate(ctx sdk.Context, delegator, from, to, fromChainID, to ) } - err = k.decreaseDelegation(ctx, delegator, from, fromChainID, amount, nextEpoch) + err = k.decreaseDelegation(ctx, delegator, from, amount) if err != nil { return utils.LavaFormatWarning("failed to decrease delegation", err, utils.Attribute{Key: "delegator", Value: delegator}, @@ -348,15 +242,7 @@ func (k Keeper) Redelegate(ctx sdk.Context, delegator, from, to, fromChainID, to // before released and transferred back to the delegator. The rewards from the // provider will be updated accordingly (or terminate) from the next epoch. // (effective on next epoch) -func (k Keeper) unbond(ctx sdk.Context, delegator, provider, chainID string, amount sdk.Coin) error { - _, found := k.specKeeper.GetSpec(ctx, chainID) - if chainID != commontypes.EMPTY_PROVIDER_CHAINID && !found { - return utils.LavaFormatWarning("cannot unbond with invalid chain ID", fmt.Errorf("chain ID not found"), - utils.LogAttr("chain_id", chainID)) - } - - nextEpoch := k.epochstorageKeeper.GetCurrentNextEpoch(ctx) - +func (k Keeper) unbond(ctx sdk.Context, delegator, provider string, amount sdk.Coin) error { if _, err := sdk.AccAddressFromBech32(delegator); err != nil { return utils.LavaFormatWarning("invalid delegator address", err, utils.Attribute{Key: "delegator", Value: delegator}, @@ -378,7 +264,7 @@ func (k Keeper) unbond(ctx sdk.Context, delegator, provider, chainID string, amo ) } - err := k.decreaseDelegation(ctx, delegator, provider, chainID, amount, nextEpoch) + err := k.decreaseDelegation(ctx, delegator, provider, amount) if err != nil { return utils.LavaFormatWarning("failed to decrease delegation", err, utils.Attribute{Key: "delegator", Value: delegator}, @@ -391,7 +277,7 @@ func (k Keeper) unbond(ctx sdk.Context, delegator, provider, chainID string, amo } // GetDelegatorProviders gets all the providers the delegator is delegated to -func (k Keeper) GetDelegatorProviders(ctx sdk.Context, delegator string, epoch uint64) (providers []string, err error) { +func (k Keeper) GetDelegatorProviders(ctx sdk.Context, delegator string) (providers []string, err error) { _, err = sdk.AccAddressFromBech32(delegator) if err != nil { return nil, utils.LavaFormatWarning("cannot get delegator's providers", err, @@ -399,14 +285,23 @@ func (k Keeper) GetDelegatorProviders(ctx sdk.Context, delegator string, epoch u ) } - var delegatorEntry types.Delegator - prefix := types.DelegatorKey(delegator) - k.delegatorFS.FindEntry(ctx, prefix, epoch, &delegatorEntry) + iter, err := k.delegations.Indexes.Number.MatchExact(ctx, delegator) + if err != nil { + return nil, err + } + + for ; iter.Valid(); iter.Next() { + key, err := iter.PrimaryKey() + if err != nil { + return nil, err + } + providers = append(providers, key.K1()) + } - return delegatorEntry.Providers, nil + return providers, nil } -func (k Keeper) GetProviderDelegators(ctx sdk.Context, provider string, epoch uint64) ([]types.Delegation, error) { +func (k Keeper) GetProviderDelegators(ctx sdk.Context, provider string) ([]types.Delegation, error) { if provider != commontypes.EMPTY_PROVIDER { _, err := sdk.AccAddressFromBech32(provider) if err != nil { @@ -416,76 +311,39 @@ func (k Keeper) GetProviderDelegators(ctx sdk.Context, provider string, epoch ui } } - var delegations []types.Delegation - indices := k.delegationFS.GetAllEntryIndicesWithPrefix(ctx, provider) - for _, ind := range indices { - var delegation types.Delegation - found := k.delegationFS.FindEntry(ctx, ind, epoch, &delegation) - if !found { - provider, delegator, chainID := types.DelegationKeyDecode(ind) - utils.LavaFormatError("delegationFS entry index has no entry", fmt.Errorf("provider delegation not found"), - utils.Attribute{Key: "delegator", Value: delegator}, - utils.Attribute{Key: "provider", Value: provider}, - utils.Attribute{Key: "chainID", Value: chainID}, - ) - continue - } - delegations = append(delegations, delegation) + iter, err := k.delegations.Iterate(ctx, collections.NewPrefixedPairRange[string, string](provider)) + if err != nil { + return nil, err } - return delegations, nil + return iter.Values() } -func (k Keeper) GetDelegation(ctx sdk.Context, delegator, provider, chainID string, epoch uint64) (types.Delegation, bool) { - var delegationEntry types.Delegation - index := types.DelegationKey(provider, delegator, chainID) - found := k.delegationFS.FindEntry(ctx, index, epoch, &delegationEntry) - - return delegationEntry, found +func (k Keeper) GetDelegation(ctx sdk.Context, provider, delegator string) (types.Delegation, bool) { + delegation, err := k.delegations.Get(ctx, types.DelegationKey(provider, delegator)) + return delegation, err == nil } -func (k Keeper) GetAllProviderDelegatorDelegations(ctx sdk.Context, delegator, provider string, epoch uint64) []types.Delegation { - prefix := types.DelegationKey(provider, delegator, "") - indices := k.delegationFS.GetAllEntryIndicesWithPrefix(ctx, prefix) - - var delegations []types.Delegation - for _, ind := range indices { - var delegation types.Delegation - _, deleted, _, found := k.delegationFS.FindEntryDetailed(ctx, ind, epoch, &delegation) - if !found { - if !deleted { - provider, delegator, chainID := types.DelegationKeyDecode(ind) - utils.LavaFormatError("delegationFS entry index has no entry", fmt.Errorf("provider delegation not found"), - utils.Attribute{Key: "delegator", Value: delegator}, - utils.Attribute{Key: "provider", Value: provider}, - utils.Attribute{Key: "chainID", Value: chainID}, - ) - } - continue - } - delegations = append(delegations, delegation) - } - - return delegations +func (k Keeper) SetDelegation(ctx sdk.Context, provider, delegator string, delegation types.Delegation) error { + return k.delegations.Set(ctx, types.DelegationKey(provider, delegator), delegation) } func (k Keeper) UnbondUniformProviders(ctx sdk.Context, delegator string, amount sdk.Coin) error { - epoch := k.epochstorageKeeper.GetCurrentNextEpoch(ctx) - providers, err := k.GetDelegatorProviders(ctx, delegator, epoch) + providers, err := k.GetDelegatorProviders(ctx, delegator) if err != nil { return err } // first remove from the empty provider if lavaslices.Contains[string](providers, commontypes.EMPTY_PROVIDER) { - delegation, found := k.GetDelegation(ctx, delegator, commontypes.EMPTY_PROVIDER, commontypes.EMPTY_PROVIDER_CHAINID, epoch) + delegation, found := k.GetDelegation(ctx, commontypes.EMPTY_PROVIDER, delegator) if found { if delegation.Amount.Amount.GTE(amount.Amount) { // we have enough here, remove all from empty delegator and bail - return k.unbond(ctx, delegator, commontypes.EMPTY_PROVIDER, commontypes.EMPTY_PROVIDER_CHAINID, amount) + return k.unbond(ctx, delegator, commontypes.EMPTY_PROVIDER, amount) } else { // we dont have enough in the empty provider, remove everything and continue with the rest - err = k.unbond(ctx, delegator, commontypes.EMPTY_PROVIDER, commontypes.EMPTY_PROVIDER_CHAINID, delegation.Amount) + err = k.unbond(ctx, delegator, commontypes.EMPTY_PROVIDER, delegation.Amount) if err != nil { return err } @@ -498,30 +356,27 @@ func (k Keeper) UnbondUniformProviders(ctx sdk.Context, delegator string, amount var delegations []types.Delegation for _, provider := range providers { - delegations = append(delegations, k.GetAllProviderDelegatorDelegations(ctx, delegator, provider, epoch)...) + delegation, found := k.GetDelegation(ctx, provider, delegator) + if found { + delegations = append(delegations, delegation) + } } slices.SortFunc(delegations, func(i, j types.Delegation) bool { return i.Amount.IsLT(j.Amount) }) - type delegationKey struct { - provider string - chainID string - } - unbondAmount := map[delegationKey]sdk.Coin{} - + unbondAmount := map[string]sdk.Coin{} // first round of deduction for i := range delegations { - key := delegationKey{provider: delegations[i].Provider, chainID: delegations[i].ChainID} amountToDeduct := amount.Amount.QuoRaw(int64(len(delegations) - i)) if delegations[i].Amount.Amount.LT(amountToDeduct) { - unbondAmount[key] = delegations[i].Amount + unbondAmount[delegations[i].Provider] = delegations[i].Amount amount = amount.Sub(delegations[i].Amount) delegations[i].Amount.Amount = sdk.ZeroInt() } else { coinToDeduct := sdk.NewCoin(delegations[i].Amount.Denom, amountToDeduct) - unbondAmount[key] = coinToDeduct + unbondAmount[delegations[i].Provider] = coinToDeduct amount = amount.Sub(coinToDeduct) delegations[i].Amount = delegations[i].Amount.Sub(coinToDeduct) } @@ -532,7 +387,7 @@ func (k Keeper) UnbondUniformProviders(ctx sdk.Context, delegator string, amount if amount.IsZero() { break } - key := delegationKey{provider: delegations[i].Provider, chainID: delegations[i].ChainID} + key := delegations[i].Provider if delegations[i].Amount.Amount.LT(amount.Amount) { unbondAmount[key].Add(delegations[i].Amount) amount = amount.Sub(delegations[i].Amount) @@ -544,8 +399,8 @@ func (k Keeper) UnbondUniformProviders(ctx sdk.Context, delegator string, amount // now unbond all for i := range delegations { - key := delegationKey{provider: delegations[i].Provider, chainID: delegations[i].ChainID} - err := k.unbond(ctx, delegator, delegations[i].Provider, delegations[i].ChainID, unbondAmount[key]) + key := delegations[i].Provider + err := k.unbond(ctx, delegator, delegations[i].Provider, unbondAmount[key]) if err != nil { return err } @@ -556,16 +411,15 @@ func (k Keeper) UnbondUniformProviders(ctx sdk.Context, delegator string, amount // returns the difference between validators delegations and provider delegation (validators-providers) func (k Keeper) VerifyDelegatorBalance(ctx sdk.Context, delAddr sdk.AccAddress) (math.Int, int, error) { - nextEpoch := k.epochstorageKeeper.GetCurrentNextEpoch(ctx) - providers, err := k.GetDelegatorProviders(ctx, delAddr.String(), nextEpoch) + providers, err := k.GetDelegatorProviders(ctx, delAddr.String()) if err != nil { return math.ZeroInt(), 0, err } sumProviderDelegations := sdk.ZeroInt() for _, p := range providers { - delegations := k.GetAllProviderDelegatorDelegations(ctx, delAddr.String(), p, nextEpoch) - for _, d := range delegations { + d, found := k.GetDelegation(ctx, p, delAddr.String()) + if found { sumProviderDelegations = sumProviderDelegations.Add(d.Amount.Amount) } } diff --git a/x/dualstaking/keeper/delegate_test.go b/x/dualstaking/keeper/delegate_test.go index 2ef090c060..4c160bfd3c 100644 --- a/x/dualstaking/keeper/delegate_test.go +++ b/x/dualstaking/keeper/delegate_test.go @@ -78,7 +78,7 @@ func TestDelegateFail(t *testing.T) { t.Run(tt.name, func(t *testing.T) { amount := sdk.NewCoin(commontypes.TokenDenom, sdk.ZeroInt()) amount.Amount = amount.Amount.Add(sdk.NewInt(tt.amount)) - _, err := ts.TxDualstakingDelegate(tt.delegator, tt.provider, tt.chainID, amount) + _, err := ts.TxDualstakingDelegate(tt.delegator, tt.provider, amount) require.Error(t, err, tt.name) }) } @@ -97,7 +97,7 @@ func TestDelegate(t *testing.T) { // delegate once amount := sdk.NewCoin(commontypes.TokenDenom, sdk.NewInt(10000)) - _, err := ts.TxDualstakingDelegate(client1Addr, provider1Addr, ts.spec.Name, amount) + _, err := ts.TxDualstakingDelegate(client1Addr, provider1Addr, amount) require.NoError(t, err) // not yet in effect @@ -111,10 +111,10 @@ func TestDelegate(t *testing.T) { require.True(t, delegated.IsEqual(stakeEntry.DelegateTotal)) // delegate twice same block (fail) - _, err = ts.TxDualstakingDelegate(client1Addr, provider1Addr, ts.spec.Name, amount) + _, err = ts.TxDualstakingDelegate(client1Addr, provider1Addr, amount) require.NoError(t, err) - _, err = ts.TxDualstakingDelegate(client1Addr, provider1Addr, ts.spec.Name, amount) + _, err = ts.TxDualstakingDelegate(client1Addr, provider1Addr, amount) require.NoError(t, err) stakeEntry = ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) @@ -143,7 +143,7 @@ func TestRedelegateFail(t *testing.T) { // delegate once for setup amount := sdk.NewCoin(commontypes.TokenDenom, sdk.NewInt(10000)) - _, err := ts.TxDualstakingDelegate(client1Addr, provider1Addr, ts.spec.Name, amount) + _, err := ts.TxDualstakingDelegate(client1Addr, provider1Addr, amount) require.NoError(t, err) template := []struct { @@ -225,7 +225,7 @@ func TestRedelegateFail(t *testing.T) { amount := sdk.NewCoin(commontypes.TokenDenom, sdk.ZeroInt()) amount.Amount = amount.Amount.Add(sdk.NewInt(tt.amount)) _, err := ts.TxDualstakingRedelegate( - tt.delegator, tt.provider1, tt.provider2, tt.chainID, tt.chainID, amount) + tt.delegator, tt.provider1, tt.provider2, amount) require.Error(t, err, tt.name) }) } @@ -247,7 +247,7 @@ func TestRedelegate(t *testing.T) { // delegate once amount := sdk.NewCoin(commontypes.TokenDenom, sdk.NewInt(10000)) _, err := ts.TxDualstakingDelegate( - client1Addr, provider1Addr, ts.spec.Name, amount) + client1Addr, provider1Addr, amount) require.NoError(t, err) // advance epoch to digest the delegate @@ -262,7 +262,7 @@ func TestRedelegate(t *testing.T) { // redelegate once amount = sdk.NewCoin(commontypes.TokenDenom, sdk.NewInt(5000)) _, err = ts.TxDualstakingRedelegate( - client1Addr, provider1Addr, provider2Addr, ts.spec.Name, ts.spec.Name, amount) + client1Addr, provider1Addr, provider2Addr, amount) require.NoError(t, err) stakeEntry1 = ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) stakeEntry2 = ts.getStakeEntry(provider2Acct.Addr.String(), ts.spec.Name) @@ -284,7 +284,7 @@ func TestRedelegate(t *testing.T) { // redelegate from unstaking provider amount = sdk.NewCoin(commontypes.TokenDenom, sdk.NewInt(5000)) _, err = ts.TxDualstakingRedelegate( - client1Addr, provider1Addr, provider2Addr, ts.spec.Name, ts.spec.Name, amount) + client1Addr, provider1Addr, provider2Addr, amount) require.NoError(t, err) // advance epoch to digest the delegate ts.AdvanceEpoch() @@ -308,7 +308,7 @@ func TestUnbondFail(t *testing.T) { // delegate once for setup amount := sdk.NewCoin(commontypes.TokenDenom, sdk.NewInt(10000)) - _, err := ts.TxDualstakingDelegate(client1Addr, provider1Addr, ts.spec.Name, amount) + _, err := ts.TxDualstakingDelegate(client1Addr, provider1Addr, amount) require.NoError(t, err) template := []struct { @@ -366,7 +366,7 @@ func TestUnbondFail(t *testing.T) { t.Run(tt.name, func(t *testing.T) { amount := sdk.NewCoin(commontypes.TokenDenom, sdk.ZeroInt()) amount.Amount = amount.Amount.Add(sdk.NewInt(tt.amount)) - _, err := ts.TxDualstakingUnbond(tt.delegator, tt.provider, tt.chainID, amount) + _, err := ts.TxDualstakingUnbond(tt.delegator, tt.provider, amount) require.Error(t, err, tt.name) }) } @@ -392,10 +392,10 @@ func TestUnbond(t *testing.T) { // delegate once amount := sdk.NewCoin(commontypes.TokenDenom, sdk.NewInt(10000)) - _, err = ts.TxDualstakingDelegate(client1Addr, provider1Addr, ts.spec.Name, amount) + _, err = ts.TxDualstakingDelegate(client1Addr, provider1Addr, amount) require.NoError(t, err) - _, err = ts.TxDualstakingDelegate(client1Addr, provider1Addr, spec2.Index, amount) + _, err = ts.TxDualstakingDelegate(client1Addr, provider1Addr, amount) require.NoError(t, err) // advance epoch to digest the delegate @@ -411,7 +411,7 @@ func TestUnbond(t *testing.T) { // unbond once amount = sdk.NewCoin(commontypes.TokenDenom, sdk.NewInt(1000)) - _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, ts.spec.Name, amount) + _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, amount) require.NoError(t, err) stakeEntry = ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) @@ -425,12 +425,12 @@ func TestUnbond(t *testing.T) { require.True(t, delegated.IsEqual(stakeEntry.DelegateTotal)) // unbond twice in same block, and then in next block - _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, ts.spec.Name, amount) + _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, amount) require.NoError(t, err) // _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, ts.spec.Name, amount) // require.Error(t, err) ts.AdvanceBlock() - _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, ts.spec.Name, amount) + _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, amount) require.NoError(t, err) stakeEntry = ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) @@ -447,14 +447,14 @@ func TestUnbond(t *testing.T) { require.NoError(t, err) // unbond from unstaking provider - _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, ts.spec.Name, amount) + _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, amount) require.NoError(t, err) stakeEntry = ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) require.True(t, delegated.IsEqual(stakeEntry.DelegateTotal)) delegated = delegated.Sub(amount) // unbond from unstaking provider everything - _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, ts.spec.Name, delegated) + _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, delegated) require.NoError(t, err) stakeEntry = ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) @@ -488,7 +488,7 @@ func TestBondUnbondBond(t *testing.T) { // delegate once amount := sdk.NewCoin(commontypes.TokenDenom, sdk.NewInt(10000)) - _, err := ts.TxDualstakingDelegate(client1Addr, provider1Addr, ts.spec.Name, amount) + _, err := ts.TxDualstakingDelegate(client1Addr, provider1Addr, amount) require.NoError(t, err) // advance epoch to digest the delegate @@ -499,7 +499,7 @@ func TestBondUnbondBond(t *testing.T) { require.True(t, delegated.IsEqual(stakeEntry.DelegateTotal)) // unbond once - _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, ts.spec.Name, amount) + _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, amount) require.NoError(t, err) stakeEntry = ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) require.True(t, delegated.IsEqual(stakeEntry.DelegateTotal)) @@ -512,7 +512,7 @@ func TestBondUnbondBond(t *testing.T) { require.True(t, delegated.IsEqual(stakeEntry.DelegateTotal)) // delegate second time - _, err = ts.TxDualstakingDelegate(client1Addr, provider1Addr, ts.spec.Name, amount) + _, err = ts.TxDualstakingDelegate(client1Addr, provider1Addr, amount) require.NoError(t, err) ts.AdvanceEpoch() @@ -533,7 +533,7 @@ func TestDualstakingUnbondStakeIsLowerThanMinStakeCausesFreeze(t *testing.T) { amountToUnbond := staked.Sub(minSelfDelegation.AddAmount(math.OneInt())) // unbond once (not unstaking completely but still below min stake) - _, err := ts.TxDualstakingUnbond(provider1Acct.GetVaultAddr(), provider, ts.spec.Name, amountToUnbond) + _, err := ts.TxDualstakingUnbond(provider1Acct.GetVaultAddr(), provider, amountToUnbond) require.NoError(t, err) stakeEntry := ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) @@ -560,7 +560,7 @@ func TestDualstakingUnbondStakeIsLowerThanMinSelfDelegationCausesUnstake(t *test amountToUnbond := staked.SubAmount(math.OneInt()) // unbond once (not unstaking completely but still below min stake) - _, err := ts.TxDualstakingUnbond(provider1Acct.GetVaultAddr(), provider, ts.spec.Name, amountToUnbond) + _, err := ts.TxDualstakingUnbond(provider1Acct.GetVaultAddr(), provider, amountToUnbond) require.NoError(t, err) stakeEntry := ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) @@ -584,7 +584,7 @@ func TestDualstakingBondStakeIsGreaterThanMinStakeCausesUnFreeze(t *testing.T) { // delegate once amount := sdk.NewCoin("ulava", sdk.NewInt(10000)) - _, err := ts.TxDualstakingDelegate(provider1Acct.GetVaultAddr(), provider1Addr, ts.spec.Name, amount) + _, err := ts.TxDualstakingDelegate(provider1Acct.GetVaultAddr(), provider1Addr, amount) require.NoError(t, err) // advance epoch to digest the delegate @@ -610,7 +610,7 @@ func TestDualstakingRedelegateFreezeOneUnFreezeOther(t *testing.T) { // redelegate once minSelfDelegation := ts.Keepers.Dualstaking.MinSelfDelegation(ts.Ctx) amountToUnbond := stake.Sub(stake.Sub(minSelfDelegation.AddAmount(math.OneInt()))) - _, err := ts.TxDualstakingRedelegate(provider1Acct.GetVaultAddr(), provider1Addr, provider2Addr, ts.spec.Name, ts.spec.Name, stake.Sub(amountToUnbond)) + _, err := ts.TxDualstakingRedelegate(provider1Acct.GetVaultAddr(), provider1Addr, provider2Addr, stake.Sub(amountToUnbond)) require.NoError(t, err) // advance epoch to digest the delegate @@ -627,7 +627,7 @@ func TestDualstakingRedelegateFreezeOneUnFreezeOther(t *testing.T) { require.False(t, stakeEntry.IsFrozen()) // redelegate again - _, err = ts.TxDualstakingRedelegate(provider2Acct.GetVaultAddr(), provider2Addr, provider1Addr, ts.spec.Name, ts.spec.Name, stake.SubAmount(amountToUnbond.Amount)) + _, err = ts.TxDualstakingRedelegate(provider2Acct.GetVaultAddr(), provider2Addr, provider1Addr, stake.SubAmount(amountToUnbond.Amount)) require.NoError(t, err) // advance epoch to digest the delegate diff --git a/x/dualstaking/keeper/delegator_reward.go b/x/dualstaking/keeper/delegator_reward.go index a1d428ee26..0f2d10387a 100644 --- a/x/dualstaking/keeper/delegator_reward.go +++ b/x/dualstaking/keeper/delegator_reward.go @@ -16,7 +16,7 @@ import ( // SetDelegatorReward set a specific DelegatorReward in the store from its index func (k Keeper) SetDelegatorReward(ctx sdk.Context, delegatorReward types.DelegatorReward) { store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.DelegatorRewardKeyPrefix)) - index := types.DelegationKey(delegatorReward.Provider, delegatorReward.Delegator, delegatorReward.ChainId) + index := types.DelegationKey(delegatorReward.Provider, delegatorReward.Delegator) b := k.cdc.MustMarshal(&delegatorReward) store.Set(types.DelegatorRewardKey( index, diff --git a/x/dualstaking/keeper/delegator_reward_test.go b/x/dualstaking/keeper/delegator_reward_test.go index ca684a3f60..3d8333e10a 100644 --- a/x/dualstaking/keeper/delegator_reward_test.go +++ b/x/dualstaking/keeper/delegator_reward_test.go @@ -20,7 +20,6 @@ func createNDelegatorReward(keeper *keeper.Keeper, ctx sdk.Context, n int) []typ for i := range items { items[i].Provider = "p" + strconv.Itoa(i) items[i].Delegator = "d" + strconv.Itoa(i) - items[i].ChainId = "c" + strconv.Itoa(i) keeper.SetDelegatorReward(ctx, items[i]) } return items @@ -30,7 +29,7 @@ func TestDelegatorRewardGet(t *testing.T) { keeper, ctx := keepertest.DualstakingKeeper(t) items := createNDelegatorReward(keeper, ctx, 10) for _, item := range items { - index := types.DelegationKey(item.Provider, item.Delegator, item.ChainId) + index := types.DelegationKey(item.Provider, item.Delegator) rst, found := keeper.GetDelegatorReward(ctx, index, ) diff --git a/x/dualstaking/keeper/grpc_query_delegator_providers.go b/x/dualstaking/keeper/grpc_query_delegator_providers.go index 172a6e6d65..f94530c7d2 100644 --- a/x/dualstaking/keeper/grpc_query_delegator_providers.go +++ b/x/dualstaking/keeper/grpc_query_delegator_providers.go @@ -2,10 +2,8 @@ package keeper import ( "context" - "fmt" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/lavanet/lava/v3/utils" "github.com/lavanet/lava/v3/x/dualstaking/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -18,30 +16,15 @@ func (k Keeper) DelegatorProviders(goCtx context.Context, req *types.QueryDelega ctx := sdk.UnwrapSDKContext(goCtx) - epoch := uint64(ctx.BlockHeight()) - if req.WithPending { - epoch = k.epochstorageKeeper.GetCurrentNextEpoch(ctx) - } - - providers, err := k.GetDelegatorProviders(ctx, req.Delegator, epoch) + providers, err := k.GetDelegatorProviders(ctx, req.Delegator) if err != nil { return nil, err } var delegations []types.Delegation for _, provider := range providers { - indices := k.delegationFS.GetAllEntryIndicesWithPrefix(ctx, types.DelegationKey(provider, req.Delegator, "")) - for _, ind := range indices { - var delegation types.Delegation - found := k.delegationFS.FindEntry(ctx, ind, epoch, &delegation) - if !found { - utils.LavaFormatError("critical: provider found in delegatorFS but not in delegationFS", fmt.Errorf("provider delegation not found"), - utils.Attribute{Key: "delegator", Value: req.Delegator}, - utils.Attribute{Key: "provider", Value: provider}, - utils.Attribute{Key: "chainID", Value: delegation.ChainID}, - ) - continue - } + delegation, found := k.GetDelegation(ctx, provider, req.Delegator) + if found { delegations = append(delegations, delegation) } } diff --git a/x/dualstaking/keeper/grpc_query_delegator_providers_test.go b/x/dualstaking/keeper/grpc_query_delegator_providers_test.go index a8688e6eee..f030a6fe4e 100644 --- a/x/dualstaking/keeper/grpc_query_delegator_providers_test.go +++ b/x/dualstaking/keeper/grpc_query_delegator_providers_test.go @@ -17,17 +17,15 @@ func TestQueryWithUnbonding(t *testing.T) { _, delegator := ts.GetAccount(common.CONSUMER, 0) _, provider := ts.GetAccount(common.PROVIDER, 0) - spec := ts.Spec("mock") - amountUint64 := uint64(100) amount := sdk.NewCoin(ts.TokenDenom(), sdk.NewIntFromUint64(amountUint64)) // delegate and query - _, err := ts.TxDualstakingDelegate(delegator, provider, spec.Index, amount) + _, err := ts.TxDualstakingDelegate(delegator, provider, amount) require.NoError(t, err) ts.AdvanceEpoch() - delegation := types.NewDelegation(delegator, provider, spec.Index, ts.Ctx.BlockTime(), ts.TokenDenom()) + delegation := types.NewDelegation(delegator, provider, ts.Ctx.BlockTime(), ts.TokenDenom()) delegation.Amount = amount res, err := ts.QueryDualstakingDelegatorProviders(delegator, false) @@ -37,7 +35,7 @@ func TestQueryWithUnbonding(t *testing.T) { // partially unbond and query unbondAmount := amount.Sub(sdk.NewCoin(ts.TokenDenom(), sdk.OneInt())) - _, err = ts.TxDualstakingUnbond(delegator, provider, spec.Index, unbondAmount) + _, err = ts.TxDualstakingUnbond(delegator, provider, unbondAmount) require.NoError(t, err) ts.AdvanceEpoch() @@ -50,7 +48,7 @@ func TestQueryWithUnbonding(t *testing.T) { require.True(t, delegation.Equal(&delegationRes)) // unbond completely and query (should not get providers) - _, err = ts.TxDualstakingUnbond(delegator, provider, spec.Index, bondedAmount) + _, err = ts.TxDualstakingUnbond(delegator, provider, bondedAmount) require.NoError(t, err) ts.AdvanceEpoch() @@ -68,16 +66,14 @@ func TestQueryWithPendingDelegations(t *testing.T) { _, delegator2 := ts.GetAccount(common.CONSUMER, 1) _, provider := ts.GetAccount(common.PROVIDER, 0) - spec := ts.Spec("mock") - amountUint64 := uint64(100) amount := sdk.NewCoin(ts.TokenDenom(), sdk.NewIntFromUint64(amountUint64)) - delegation1 := types.NewDelegation(delegator1, provider, spec.Index, ts.Ctx.BlockTime(), ts.TokenDenom()) + delegation1 := types.NewDelegation(delegator1, provider, ts.Ctx.BlockTime(), ts.TokenDenom()) delegation1.Amount = amount // delegate without advancing an epoch - _, err := ts.TxDualstakingDelegate(delegator1, provider, spec.Index, amount) + _, err := ts.TxDualstakingDelegate(delegator1, provider, amount) require.NoError(t, err) // query pending delegators @@ -108,10 +104,10 @@ func TestQueryWithPendingDelegations(t *testing.T) { require.True(t, delegationRes.Equal(&delegation1)) // delegate delegator2 and query again - delegation2 := types.NewDelegation(delegator2, provider, spec.Index, ts.Ctx.BlockTime(), ts.TokenDenom()) + delegation2 := types.NewDelegation(delegator2, provider, ts.Ctx.BlockTime(), ts.TokenDenom()) delegation2.Amount = amount - _, err = ts.TxDualstakingDelegate(delegator2, provider, spec.Index, amount) + _, err = ts.TxDualstakingDelegate(delegator2, provider, amount) require.NoError(t, err) // delegator2 should show when quering with showPending=true and not show when showPending=false @@ -140,7 +136,6 @@ func TestQueryProviderMultipleDelegators(t *testing.T) { delegators := []string{delegator1, delegator2, delegator3} - spec := ts.Spec("mock") spec1 := ts.Spec("mock1") err := ts.StakeProvider(providerAcc.GetVaultAddr(), provider, spec1, testStake) require.NoError(t, err) @@ -150,16 +145,10 @@ func TestQueryProviderMultipleDelegators(t *testing.T) { delegations := []types.Delegation{} for i := 0; i < len(delegators); i++ { - var chainID string - if i == 0 { - chainID = spec.Index - } else { - chainID = spec1.Index - } - _, err := ts.TxDualstakingDelegate(delegators[i], provider, chainID, amount) + _, err := ts.TxDualstakingDelegate(delegators[i], provider, amount) require.NoError(t, err) - delegation := types.NewDelegation(delegators[i], provider, chainID, ts.Ctx.BlockTime(), ts.TokenDenom()) + delegation := types.NewDelegation(delegators[i], provider, ts.Ctx.BlockTime(), ts.TokenDenom()) delegation.Amount = amount delegations = append(delegations, delegation) } @@ -187,17 +176,15 @@ func TestQueryDelegatorMultipleProviders(t *testing.T) { providers := []string{provider1, provider2, provider3} - spec := ts.Spec("mock") - amountUint64 := uint64(100) amount := sdk.NewCoin(ts.TokenDenom(), sdk.NewIntFromUint64(amountUint64)) delegations := []types.Delegation{} for i := 0; i < len(providers); i++ { - _, err := ts.TxDualstakingDelegate(delegator, providers[i], spec.Index, amount) + _, err := ts.TxDualstakingDelegate(delegator, providers[i], amount) require.NoError(t, err) - delegation := types.NewDelegation(delegator, providers[i], spec.Index, ts.Ctx.BlockTime(), ts.TokenDenom()) + delegation := types.NewDelegation(delegator, providers[i], ts.Ctx.BlockTime(), ts.TokenDenom()) delegation.Amount = amount delegations = append(delegations, delegation) } @@ -222,16 +209,14 @@ func TestQueryDelegatorUnstakedProvider(t *testing.T) { _, unstakedProvider := ts.GetAccount(common.PROVIDER, 0) _, unstakingProvider := ts.GetAccount(common.PROVIDER, 1) - spec := ts.Spec("mock") - amountUint64 := uint64(100) amount := sdk.NewCoin(ts.TokenDenom(), sdk.NewIntFromUint64(amountUint64)) // shouldn't be able to delegate to unstaked provider - _, err := ts.TxDualstakingDelegate(delegator, unstakedProvider, spec.Index, amount) + _, err := ts.TxDualstakingDelegate(delegator, unstakedProvider, amount) require.Error(t, err) // shouldn't be able to delegate to unstaking provider (even though it didn't get its funds back, it's still considered unstaked) - _, err = ts.TxDualstakingDelegate(delegator, unstakingProvider, spec.Index, amount) + _, err = ts.TxDualstakingDelegate(delegator, unstakingProvider, amount) require.Error(t, err) } diff --git a/x/dualstaking/keeper/grpc_query_provider_delegators.go b/x/dualstaking/keeper/grpc_query_provider_delegators.go index 72085ad045..6d02347ac7 100644 --- a/x/dualstaking/keeper/grpc_query_provider_delegators.go +++ b/x/dualstaking/keeper/grpc_query_provider_delegators.go @@ -16,12 +16,7 @@ func (k Keeper) ProviderDelegators(goCtx context.Context, req *types.QueryProvid ctx := sdk.UnwrapSDKContext(goCtx) - epoch := uint64(ctx.BlockHeight()) - if req.WithPending { - epoch = k.epochstorageKeeper.GetCurrentNextEpoch(ctx) - } - - delegations, err := k.GetProviderDelegators(ctx, req.Provider, epoch) + delegations, err := k.GetProviderDelegators(ctx, req.Provider) if err != nil { return nil, err } diff --git a/x/dualstaking/keeper/grpc_query_provider_delegators_test.go b/x/dualstaking/keeper/grpc_query_provider_delegators_test.go index 4ae641a48e..d173a072c1 100644 --- a/x/dualstaking/keeper/grpc_query_provider_delegators_test.go +++ b/x/dualstaking/keeper/grpc_query_provider_delegators_test.go @@ -17,17 +17,15 @@ func TestQueryProviderDelegatorsWithUnbonding(t *testing.T) { _, delegator := ts.GetAccount(common.CONSUMER, 0) _, provider := ts.GetAccount(common.PROVIDER, 0) - spec := ts.Spec("mock") - amountUint64 := uint64(100) amount := sdk.NewCoin(ts.TokenDenom(), sdk.NewIntFromUint64(amountUint64)) // delegate and query - _, err := ts.TxDualstakingDelegate(delegator, provider, spec.Index, amount) + _, err := ts.TxDualstakingDelegate(delegator, provider, amount) require.NoError(t, err) ts.AdvanceEpoch() - delegation := types.NewDelegation(delegator, provider, spec.Index, ts.Ctx.BlockTime(), ts.TokenDenom()) + delegation := types.NewDelegation(delegator, provider, ts.Ctx.BlockTime(), ts.TokenDenom()) delegation.Amount = amount res, err := ts.QueryDualstakingProviderDelegators(provider, false) @@ -43,7 +41,7 @@ func TestQueryProviderDelegatorsWithUnbonding(t *testing.T) { // partially unbond and query unbondAmount := amount.Sub(sdk.NewCoin(ts.TokenDenom(), sdk.OneInt())) - _, err = ts.TxDualstakingUnbond(delegator, provider, spec.Index, unbondAmount) + _, err = ts.TxDualstakingUnbond(delegator, provider, unbondAmount) require.NoError(t, err) ts.AdvanceEpoch() @@ -61,7 +59,7 @@ func TestQueryProviderDelegatorsWithUnbonding(t *testing.T) { require.True(t, delegation.Equal(&delegationRes)) // unbond completely and query (should not get providers) - _, err = ts.TxDualstakingUnbond(delegator, provider, spec.Index, bondedAmount) + _, err = ts.TxDualstakingUnbond(delegator, provider, bondedAmount) require.NoError(t, err) ts.AdvanceEpoch() @@ -79,16 +77,14 @@ func TestQueryProviderDelegatorsWithPendingDelegations(t *testing.T) { _, delegator2 := ts.GetAccount(common.CONSUMER, 1) _, provider := ts.GetAccount(common.PROVIDER, 0) - spec := ts.Spec("mock") - amountUint64 := uint64(100) amount := sdk.NewCoin(ts.TokenDenom(), sdk.NewIntFromUint64(amountUint64)) - delegation1 := types.NewDelegation(delegator1, provider, spec.Index, ts.Ctx.BlockTime(), ts.TokenDenom()) + delegation1 := types.NewDelegation(delegator1, provider, ts.Ctx.BlockTime(), ts.TokenDenom()) delegation1.Amount = amount // delegate without advancing an epoch - _, err := ts.TxDualstakingDelegate(delegator1, provider, spec.Index, amount) + _, err := ts.TxDualstakingDelegate(delegator1, provider, amount) require.NoError(t, err) // query pending delegators @@ -132,9 +128,9 @@ func TestQueryProviderDelegatorsWithPendingDelegations(t *testing.T) { require.True(t, delegationRes.Equal(&delegation1)) // delegate delegator2 and query again - delegation2 := types.NewDelegation(delegator2, provider, spec.Index, ts.Ctx.BlockTime(), ts.TokenDenom()) + delegation2 := types.NewDelegation(delegator2, provider, ts.Ctx.BlockTime(), ts.TokenDenom()) delegation2.Amount = amount - _, err = ts.TxDualstakingDelegate(delegator2, provider, spec.Index, amount) + _, err = ts.TxDualstakingDelegate(delegator2, provider, amount) require.NoError(t, err) // delegator2 should show when quering with showPending=true and not show when showPending=false @@ -174,7 +170,6 @@ func TestQueryProviderDelegatorsProviderMultipleDelegators(t *testing.T) { delegators := []string{delegator1, delegator2, delegator3} - spec := ts.Spec("mock") spec1 := ts.Spec("mock1") err := ts.StakeProvider(providerAcc.GetVaultAddr(), provider, spec1, testStake) require.NoError(t, err) @@ -184,16 +179,10 @@ func TestQueryProviderDelegatorsProviderMultipleDelegators(t *testing.T) { delegations := []types.Delegation{} for i := 0; i < len(delegators); i++ { - var chainID string - if i == 0 { - chainID = spec.Index - } else { - chainID = spec1.Index - } - _, err := ts.TxDualstakingDelegate(delegators[i], provider, chainID, amount) + _, err := ts.TxDualstakingDelegate(delegators[i], provider, amount) require.NoError(t, err) - delegation := types.NewDelegation(delegators[i], provider, chainID, ts.Ctx.BlockTime(), ts.TokenDenom()) + delegation := types.NewDelegation(delegators[i], provider, ts.Ctx.BlockTime(), ts.TokenDenom()) delegation.Amount = amount delegations = append(delegations, delegation) } @@ -223,17 +212,15 @@ func TestQueryProviderDelegatorsDelegatorMultipleProviders(t *testing.T) { providers := []string{provider1, provider2, provider3} - spec := ts.Spec("mock") - amountUint64 := uint64(100) amount := sdk.NewCoin(ts.TokenDenom(), sdk.NewIntFromUint64(amountUint64)) delegations := []types.Delegation{} for i := 0; i < len(providers); i++ { - _, err := ts.TxDualstakingDelegate(delegator, providers[i], spec.Index, amount) + _, err := ts.TxDualstakingDelegate(delegator, providers[i], amount) require.NoError(t, err) - delegation := types.NewDelegation(delegator, providers[i], spec.Index, ts.Ctx.BlockTime(), ts.TokenDenom()) + delegation := types.NewDelegation(delegator, providers[i], ts.Ctx.BlockTime(), ts.TokenDenom()) delegation.Amount = amount delegations = append(delegations, delegation) } @@ -263,16 +250,14 @@ func TestQueryProviderDelegatorsDelegatorUnstakedProvider(t *testing.T) { _, unstakedProvider := ts.GetAccount(common.PROVIDER, 0) _, unstakingProvider := ts.GetAccount(common.PROVIDER, 1) - spec := ts.Spec("mock") - amountUint64 := uint64(100) amount := sdk.NewCoin(ts.TokenDenom(), sdk.NewIntFromUint64(amountUint64)) // shouldn't be able to delegate to unstaked provider - _, err := ts.TxDualstakingDelegate(delegator, unstakedProvider, spec.Index, amount) + _, err := ts.TxDualstakingDelegate(delegator, unstakedProvider, amount) require.Error(t, err) // shouldn't be able to delegate to unstaking provider (even though it didn't get its funds back, it's still considered unstaked) - _, err = ts.TxDualstakingDelegate(delegator, unstakingProvider, spec.Index, amount) + _, err = ts.TxDualstakingDelegate(delegator, unstakingProvider, amount) require.Error(t, err) } diff --git a/x/dualstaking/keeper/hooks_test.go b/x/dualstaking/keeper/hooks_test.go index 9a46c24953..94374e3ecb 100644 --- a/x/dualstaking/keeper/hooks_test.go +++ b/x/dualstaking/keeper/hooks_test.go @@ -138,8 +138,6 @@ func TestReDelegateToProvider(t *testing.T) { _, err = ts.TxDualstakingRedelegate(delegator.Addr.String(), commontypes.EMPTY_PROVIDER, provider, - commontypes.EMPTY_PROVIDER_CHAINID, - entry.Chain, sdk.NewCoin(ts.TokenDenom(), amount)) require.NoError(t, err) @@ -208,8 +206,6 @@ func TestUnbondUniformProviders(t *testing.T) { _, err = ts.TxDualstakingRedelegate(delegatorAcc.Addr.String(), commontypes.EMPTY_PROVIDER, provider, - commontypes.EMPTY_PROVIDER_CHAINID, - ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), redelegateAmts[i])) require.NoError(t, err) } @@ -343,8 +339,6 @@ func TestValidatorAndProvidersSlash(t *testing.T) { _, err = ts.TxDualstakingRedelegate(delegatorAcc.Addr.String(), commontypes.EMPTY_PROVIDER, provider, - commontypes.EMPTY_PROVIDER_CHAINID, - ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), redelegateAmts[i])) require.NoError(t, err) ts.AdvanceEpoch() @@ -361,7 +355,7 @@ func TestValidatorAndProvidersSlash(t *testing.T) { ts.AdvanceBlockUntilStale() // sanity check: redelegate from provider0 to provider1 and check delegations balance - _, err = ts.TxDualstakingRedelegate(delegator, providers[0], providers[1], ts.spec.Index, ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), consensusPowerTokens.MulRaw(5))) + _, err = ts.TxDualstakingRedelegate(delegator, providers[0], providers[1], sdk.NewCoin(ts.TokenDenom(), consensusPowerTokens.MulRaw(5))) require.NoError(t, err) ts.AdvanceEpoch() // apply redelegation diff, _, err := ts.Keepers.Dualstaking.VerifyDelegatorBalance(ts.Ctx, delegatorAcc.Addr) @@ -369,7 +363,7 @@ func TestValidatorAndProvidersSlash(t *testing.T) { require.True(t, diff.IsZero()) // sanity check: unbond some of provider2's funds and check delegations balance - _, err = ts.TxDualstakingUnbond(delegator, providers[2], ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), consensusPowerTokens.MulRaw(5))) + _, err = ts.TxDualstakingUnbond(delegator, providers[2], sdk.NewCoin(ts.TokenDenom(), consensusPowerTokens.MulRaw(5))) require.NoError(t, err) ts.AdvanceEpoch() // apply unbond diff, _, err = ts.Keepers.Dualstaking.VerifyDelegatorBalance(ts.Ctx, delegatorAcc.Addr) @@ -495,7 +489,7 @@ func TestHooksRandomDelegations(t *testing.T) { delegatorAcc = prevDelegatorAcc delegator = prevDelegator } - _, err := ts.TxDualstakingDelegate(delegator, provider, ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(int64(d)))) + _, err := ts.TxDualstakingDelegate(delegator, provider, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(int64(d)))) require.NoError(t, err) _, found := ts.Keepers.StakingKeeper.GetDelegation(ts.Ctx, delegatorAcc.Addr, sdk.ValAddress(validatorAcc.Addr)) @@ -533,7 +527,7 @@ func TestNotRoundedShares(t *testing.T) { require.NoError(t, err) ts.Keepers.StakingKeeper.SetDelegation(ts.Ctx, stakingtypes.NewDelegation(delegatorAcc.Addr, sdk.ValAddress(validatorAcc.Addr), shares)) - _, err = ts.TxDualstakingDelegate(delegator, provider, ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), delAmount)) + _, err = ts.TxDualstakingDelegate(delegator, provider, sdk.NewCoin(ts.TokenDenom(), delAmount)) require.NoError(t, err) } @@ -577,8 +571,6 @@ func TestUnbondValidatorButNotRemoveStakeEntry(t *testing.T) { _, err = ts.TxDualstakingRedelegate(delegatorAcc1.Addr.String(), commontypes.EMPTY_PROVIDER, provider, - commontypes.EMPTY_PROVIDER_CHAINID, - ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(9999))) require.Error(t, err) @@ -634,8 +626,6 @@ func TestUndelegateProvider(t *testing.T) { _, err = ts.TxDualstakingRedelegate(delegatorAcc1.Addr.String(), commontypes.EMPTY_PROVIDER, provider, - commontypes.EMPTY_PROVIDER_CHAINID, - ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(9999))) require.NoError(t, err) @@ -671,8 +661,6 @@ func TestUndelegateProvider(t *testing.T) { _, err = ts.TxDualstakingRedelegate(delegatorAcc1.Addr.String(), provider, commontypes.EMPTY_PROVIDER, - ts.spec.Index, - commontypes.EMPTY_PROVIDER_CHAINID, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(1))) require.NoError(t, err) @@ -685,8 +673,6 @@ func TestUndelegateProvider(t *testing.T) { _, err = ts.TxDualstakingRedelegate(delegatorAcc2.Addr.String(), commontypes.EMPTY_PROVIDER, provider, - commontypes.EMPTY_PROVIDER_CHAINID, - ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(9998))) require.NoError(t, err) @@ -696,16 +682,12 @@ func TestUndelegateProvider(t *testing.T) { _, err = ts.TxDualstakingRedelegate(delegatorAcc1.Addr.String(), provider, commontypes.EMPTY_PROVIDER, - ts.spec.Index, - commontypes.EMPTY_PROVIDER_CHAINID, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(9999))) require.Error(t, err) _, err = ts.TxDualstakingRedelegate(delegatorAcc1.Addr.String(), provider, commontypes.EMPTY_PROVIDER, - ts.spec.Index, - commontypes.EMPTY_PROVIDER_CHAINID, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(9998))) require.NoError(t, err) } diff --git a/x/dualstaking/keeper/keeper.go b/x/dualstaking/keeper/keeper.go index 4749bb3082..9b5223143f 100644 --- a/x/dualstaking/keeper/keeper.go +++ b/x/dualstaking/keeper/keeper.go @@ -2,15 +2,14 @@ package keeper import ( "fmt" - "strconv" + "cosmossdk.io/collections" abci "github.com/cometbft/cometbft/abci/types" "github.com/cometbft/cometbft/libs/log" "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - fixationtypes "github.com/lavanet/lava/v3/x/fixationstore/types" "github.com/lavanet/lava/v3/x/dualstaking/types" ) @@ -28,8 +27,7 @@ type ( epochstorageKeeper types.EpochstorageKeeper specKeeper types.SpecKeeper - delegationFS fixationtypes.FixationStore // map proviers/chainID -> delegations - delegatorFS fixationtypes.FixationStore // map delegators -> providers + delegations *collections.IndexedMap[collections.Pair[string, string], types.Delegation, types.DelegationIndexes] } ) @@ -62,49 +60,20 @@ func NewKeeper( epochstorageKeeper: epochstorageKeeper, specKeeper: specKeeper, } - - delegationFS := *fixationStoreKeeper.NewFixationStore(storeKey, types.DelegationPrefix) - delegatorFS := *fixationStoreKeeper.NewFixationStore(storeKey, types.DelegatorPrefix) - - keeper.delegationFS = delegationFS - keeper.delegatorFS = delegatorFS - return keeper } -// ExportDelegations exports dualstaking delegations data (for genesis) -func (k Keeper) ExportDelegations(ctx sdk.Context) fixationtypes.GenesisState { - return k.delegationFS.Export(ctx) -} - -// ExportDelegators exports dualstaking delegators data (for genesis) -func (k Keeper) ExportDelegators(ctx sdk.Context) fixationtypes.GenesisState { - return k.delegatorFS.Export(ctx) -} - -// InitDelegations imports dualstaking delegations data (from genesis) -func (k Keeper) InitDelegations(ctx sdk.Context, data fixationtypes.GenesisState) { - k.delegationFS.Init(ctx, data) -} - -// InitDelegators imports dualstaking delegators data (from genesis) -func (k Keeper) InitDelegators(ctx sdk.Context, data fixationtypes.GenesisState) { - k.delegatorFS.Init(ctx, data) -} - func (k Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) } -func (k Keeper) ChangeDelegationTimestampForTesting(ctx sdk.Context, index string, block uint64, timestamp int64) error { - var d types.Delegation - entryBlock, _, _, found := k.delegationFS.FindEntryDetailed(ctx, index, block, &d) +func (k Keeper) ChangeDelegationTimestampForTesting(ctx sdk.Context, provider, delegator string, timestamp int64) error { + d, found := k.GetDelegation(ctx, provider, delegator) if !found { - return fmt.Errorf("cannot change delegation timestamp: delegation not found. index: %s, block: %s", index, strconv.FormatUint(block, 10)) + return fmt.Errorf("cannot change delegation timestamp: delegation not found. provider: %s, delegator: %s", provider, delegator) } d.Timestamp = timestamp - k.delegationFS.ModifyEntry(ctx, index, entryBlock, &d) - return nil + return k.SetDelegation(ctx, provider, delegator, d) } func (k Keeper) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { diff --git a/x/dualstaking/keeper/msg_server_delegate.go b/x/dualstaking/keeper/msg_server_delegate.go index 0ce56b460a..054a8a9909 100644 --- a/x/dualstaking/keeper/msg_server_delegate.go +++ b/x/dualstaking/keeper/msg_server_delegate.go @@ -2,7 +2,6 @@ package keeper import ( "context" - "fmt" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -13,17 +12,11 @@ import ( func (k msgServer) Delegate(goCtx context.Context, msg *types.MsgDelegate) (*types.MsgDelegateResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - return &types.MsgDelegateResponse{}, k.Keeper.DelegateFull(ctx, msg.Creator, msg.Validator, msg.Provider, msg.ChainID, msg.Amount) + return &types.MsgDelegateResponse{}, k.Keeper.DelegateFull(ctx, msg.Creator, msg.Validator, msg.Provider, msg.Amount) } // DelegateFull uses staking module for to delegate with hooks -func (k Keeper) DelegateFull(ctx sdk.Context, delegator string, validator string, provider string, chainID string, amount sdk.Coin) error { - _, found := k.specKeeper.GetSpec(ctx, chainID) - if !found && chainID != commontypes.EMPTY_PROVIDER_CHAINID { - return utils.LavaFormatWarning("invalid chain ID", fmt.Errorf("chain ID not found"), - utils.LogAttr("chain_id", chainID)) - } - +func (k Keeper) DelegateFull(ctx sdk.Context, delegator string, validator string, provider string, amount sdk.Coin) error { valAddr, valErr := sdk.ValAddressFromBech32(validator) if valErr != nil { return valErr @@ -47,9 +40,7 @@ func (k Keeper) DelegateFull(ctx sdk.Context, delegator string, validator string return err } - nextEpoch := k.epochstorageKeeper.GetCurrentNextEpoch(ctx) - - delegation, found := k.GetDelegation(ctx, delegator, commontypes.EMPTY_PROVIDER, commontypes.EMPTY_PROVIDER_CHAINID, nextEpoch) + delegation, found := k.GetDelegation(ctx, delegator, commontypes.EMPTY_PROVIDER) amountBefore := sdk.ZeroInt() if found { amountBefore = delegation.Amount.Amount @@ -60,7 +51,7 @@ func (k Keeper) DelegateFull(ctx sdk.Context, delegator string, validator string return err } - delegation, _ = k.GetDelegation(ctx, delegator, commontypes.EMPTY_PROVIDER, commontypes.EMPTY_PROVIDER_CHAINID, nextEpoch) + delegation, _ = k.GetDelegation(ctx, delegator, commontypes.EMPTY_PROVIDER) amount.Amount = delegation.Amount.Amount.Sub(amountBefore) @@ -69,8 +60,6 @@ func (k Keeper) DelegateFull(ctx sdk.Context, delegator string, validator string delegator, commontypes.EMPTY_PROVIDER, provider, - commontypes.EMPTY_PROVIDER_CHAINID, - chainID, amount, ) @@ -79,7 +68,6 @@ func (k Keeper) DelegateFull(ctx sdk.Context, delegator string, validator string details := map[string]string{ "delegator": delegator, "provider": provider, - "chainID": chainID, "amount": amount.String(), } utils.LogLavaEvent(ctx, logger, types.DelegateEventName, details, "Delegate") diff --git a/x/dualstaking/keeper/msg_server_redelegate.go b/x/dualstaking/keeper/msg_server_redelegate.go index 4e3c112b17..bb601c3db7 100644 --- a/x/dualstaking/keeper/msg_server_redelegate.go +++ b/x/dualstaking/keeper/msg_server_redelegate.go @@ -5,7 +5,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/lavanet/lava/v3/utils" - commontypes "github.com/lavanet/lava/v3/utils/common/types" "github.com/lavanet/lava/v3/x/dualstaking/types" ) @@ -20,21 +19,11 @@ func (k msgServer) Redelegate(goCtx context.Context, msg *types.MsgRedelegate) ( return &types.MsgRedelegateResponse{}, err } - // allow non empty chainID calls to redelegate form empty provider - if msg.FromChainID == commontypes.EMPTY_PROVIDER_CHAINID_STAR { - msg.FromChainID = commontypes.EMPTY_PROVIDER_CHAINID - } - if msg.ToChainID == commontypes.EMPTY_PROVIDER_CHAINID_STAR { - msg.ToChainID = commontypes.EMPTY_PROVIDER_CHAINID - } - err := k.Keeper.Redelegate( ctx, msg.Creator, msg.FromProvider, msg.ToProvider, - msg.FromChainID, - msg.ToChainID, msg.Amount, ) @@ -44,8 +33,6 @@ func (k msgServer) Redelegate(goCtx context.Context, msg *types.MsgRedelegate) ( "delegator": msg.Creator, "from_provider": msg.FromProvider, "to_provider": msg.ToProvider, - "from_chainID": msg.FromChainID, - "to_chainID": msg.ToChainID, "amount": msg.Amount.String(), } utils.LogLavaEvent(ctx, logger, types.RedelegateEventName, details, "Redelegate") diff --git a/x/dualstaking/keeper/msg_server_unbond.go b/x/dualstaking/keeper/msg_server_unbond.go index d195fbf80e..92f4717c85 100644 --- a/x/dualstaking/keeper/msg_server_unbond.go +++ b/x/dualstaking/keeper/msg_server_unbond.go @@ -45,8 +45,6 @@ func (k Keeper) UnbondFull(ctx sdk.Context, delegator string, validator string, delegator, provider, commontypes.EMPTY_PROVIDER, - chainID, - commontypes.EMPTY_PROVIDER_CHAINID, amount, ) if err != nil { diff --git a/x/dualstaking/types/delegate.go b/x/dualstaking/types/delegate.go index 420ebc5f70..c7518c2fc3 100644 --- a/x/dualstaking/types/delegate.go +++ b/x/dualstaking/types/delegate.go @@ -3,16 +3,36 @@ package types import ( "time" + "cosmossdk.io/collections" + "cosmossdk.io/collections/indexes" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/lavanet/lava/v3/utils" "github.com/lavanet/lava/v3/utils/lavaslices" ) -func NewDelegation(delegator, provider, chainID string, blockTime time.Time, tokenDenom string) Delegation { +var DelegationIndexPrefix = collections.NewPrefix(1) + +type DelegationIndexes struct { + Number *indexes.ReversePair[string, string, Delegation] +} + +func (a DelegationIndexes) IndexesList() []collections.Index[collections.Pair[string, string], Delegation] { + return []collections.Index[collections.Pair[string, string], Delegation]{a.Number} +} + +func NewDelegationIndexes(sb *collections.SchemaBuilder) DelegationIndexes { + return DelegationIndexes{ + Number: indexes.NewReversePair[Delegation]( + sb, DelegationIndexPrefix, "delegation_by_provider_delegator", + collections.PairKeyCodec(collections.StringKey, collections.StringKey), + ), + } +} + +func NewDelegation(delegator, provider string, blockTime time.Time, tokenDenom string) Delegation { return Delegation{ Delegator: delegator, Provider: provider, - ChainID: chainID, Amount: sdk.NewCoin(tokenDenom, sdk.ZeroInt()), Timestamp: utils.NextMonth(blockTime).UTC().Unix(), } @@ -33,7 +53,6 @@ func (delegation *Delegation) IsZero() bool { func (delegation *Delegation) Equal(other *Delegation) bool { if delegation.Delegator != other.Delegator || delegation.Provider != other.Provider || - delegation.ChainID != other.ChainID || !delegation.Amount.IsEqual(other.Amount) { return false } diff --git a/x/dualstaking/types/delegate.pb.go b/x/dualstaking/types/delegate.pb.go index 3e04209a2b..34ec8b0c40 100644 --- a/x/dualstaking/types/delegate.pb.go +++ b/x/dualstaking/types/delegate.pb.go @@ -26,7 +26,6 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Delegation struct { Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` - ChainID string `protobuf:"bytes,2,opt,name=chainID,proto3" json:"chainID,omitempty"` Delegator string `protobuf:"bytes,3,opt,name=delegator,proto3" json:"delegator,omitempty"` Amount types.Coin `protobuf:"bytes,4,opt,name=amount,proto3" json:"amount"` Timestamp int64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` @@ -72,13 +71,6 @@ func (m *Delegation) GetProvider() string { return "" } -func (m *Delegation) GetChainID() string { - if m != nil { - return m.ChainID - } - return "" -} - func (m *Delegation) GetDelegator() string { if m != nil { return m.Delegator @@ -154,27 +146,26 @@ func init() { } var fileDescriptor_547eac7f30bf94d4 = []byte{ - // 306 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x91, 0xb1, 0x4e, 0xc3, 0x30, - 0x10, 0x86, 0x63, 0x5a, 0x0a, 0x31, 0x5b, 0xc4, 0x60, 0xaa, 0xca, 0x44, 0x5d, 0x28, 0x8b, 0xad, - 0xd2, 0x81, 0xbd, 0x74, 0x80, 0xb5, 0x23, 0x9b, 0x93, 0x5a, 0xa9, 0x45, 0xe3, 0x8b, 0x62, 0x37, - 0x82, 0xb7, 0xe0, 0x6d, 0x78, 0x85, 0x8e, 0x1d, 0x99, 0x10, 0x4a, 0x5e, 0x04, 0x39, 0x49, 0x53, - 0x3a, 0x9d, 0xef, 0xff, 0x7f, 0xf9, 0x3e, 0xdd, 0xe1, 0xbb, 0x8d, 0x28, 0x84, 0x96, 0x96, 0xbb, - 0xca, 0x57, 0x5b, 0xb1, 0x31, 0x56, 0xbc, 0x29, 0x9d, 0xf0, 0x95, 0xdc, 0xc8, 0x44, 0x58, 0xc9, - 0xb2, 0x1c, 0x2c, 0x04, 0xa4, 0x0d, 0x32, 0x57, 0xd9, 0xbf, 0xe0, 0xf0, 0x3a, 0x81, 0x04, 0xea, - 0x10, 0x77, 0xaf, 0x26, 0x3f, 0xa4, 0x31, 0x98, 0x14, 0x0c, 0x8f, 0x84, 0x91, 0xbc, 0x98, 0x46, - 0xd2, 0x8a, 0x29, 0x8f, 0x41, 0xe9, 0xc6, 0x1f, 0x7f, 0x21, 0x8c, 0x17, 0xcd, 0x08, 0x05, 0x3a, - 0x18, 0xe2, 0xcb, 0x2c, 0x87, 0x42, 0xad, 0x64, 0x4e, 0x50, 0x88, 0x26, 0xfe, 0xb2, 0xeb, 0x03, - 0x82, 0x2f, 0xe2, 0xb5, 0x50, 0xfa, 0x65, 0x41, 0xce, 0x6a, 0xeb, 0xd0, 0x06, 0x23, 0xec, 0xb7, - 0x98, 0x90, 0x93, 0x5e, 0xed, 0x1d, 0x85, 0xe0, 0x11, 0x0f, 0x44, 0x0a, 0x5b, 0x6d, 0x49, 0x3f, - 0x44, 0x93, 0xab, 0x87, 0x1b, 0xd6, 0x30, 0x31, 0xc7, 0xc4, 0x5a, 0x26, 0xf6, 0x04, 0x4a, 0xcf, - 0xfb, 0xbb, 0x9f, 0x5b, 0x6f, 0xd9, 0xc6, 0xdd, 0xb7, 0x56, 0xa5, 0xd2, 0x58, 0x91, 0x66, 0xe4, - 0x3c, 0x44, 0x93, 0xde, 0xf2, 0x28, 0x8c, 0xef, 0xb1, 0xbf, 0xe8, 0x66, 0x8c, 0xb0, 0x7f, 0xe0, - 0x34, 0x04, 0x85, 0x3d, 0x47, 0xd0, 0x09, 0xf3, 0xe7, 0x5d, 0x49, 0xd1, 0xbe, 0xa4, 0xe8, 0xb7, - 0xa4, 0xe8, 0xb3, 0xa2, 0xde, 0xbe, 0xa2, 0xde, 0x77, 0x45, 0xbd, 0x57, 0x96, 0x28, 0xbb, 0xde, - 0x46, 0x2c, 0x86, 0x94, 0x9f, 0x9c, 0xa0, 0x98, 0xf1, 0xf7, 0x93, 0x3b, 0xd8, 0x8f, 0x4c, 0x9a, - 0x68, 0x50, 0x6f, 0x6d, 0xf6, 0x17, 0x00, 0x00, 0xff, 0xff, 0x90, 0xb7, 0x12, 0x3c, 0xb0, 0x01, - 0x00, 0x00, + // 300 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x90, 0xb1, 0x4e, 0xf3, 0x30, + 0x14, 0x85, 0xe3, 0x3f, 0xfd, 0xab, 0xc6, 0x2c, 0x28, 0x62, 0x30, 0x55, 0x65, 0xa2, 0x2e, 0x94, + 0xc5, 0x56, 0xe9, 0xc0, 0x5e, 0x3a, 0x20, 0xc6, 0x8e, 0x6c, 0x4e, 0x6b, 0x05, 0x8b, 0xc6, 0x37, + 0x8a, 0x9d, 0x08, 0xde, 0x82, 0x77, 0xe0, 0x65, 0x3a, 0x76, 0x64, 0x42, 0x28, 0x79, 0x11, 0xe4, + 0x24, 0xa4, 0x74, 0xba, 0xf6, 0xb9, 0x47, 0xf7, 0x3b, 0x3a, 0xf8, 0x7a, 0x27, 0x4a, 0xa1, 0xa5, + 0xe5, 0x6e, 0xf2, 0x6d, 0x21, 0x76, 0xc6, 0x8a, 0x17, 0xa5, 0x13, 0xbe, 0x95, 0x3b, 0x99, 0x08, + 0x2b, 0x59, 0x96, 0x83, 0x85, 0x90, 0x74, 0x46, 0xe6, 0x26, 0xfb, 0x63, 0x1c, 0x5f, 0x24, 0x90, + 0x40, 0x63, 0xe2, 0xee, 0xd5, 0xfa, 0xc7, 0x74, 0x03, 0x26, 0x05, 0xc3, 0x63, 0x61, 0x24, 0x2f, + 0xe7, 0xb1, 0xb4, 0x62, 0xce, 0x37, 0xa0, 0x74, 0xbb, 0x9f, 0x7e, 0x20, 0x8c, 0x57, 0x2d, 0x42, + 0x81, 0x0e, 0xc7, 0x78, 0x94, 0xe5, 0x50, 0xaa, 0xad, 0xcc, 0x09, 0x8a, 0xd0, 0x2c, 0x58, 0xf7, + 0xff, 0x70, 0x82, 0x83, 0x2e, 0x0c, 0xe4, 0xc4, 0x6f, 0x96, 0x47, 0x21, 0xbc, 0xc3, 0x43, 0x91, + 0x42, 0xa1, 0x2d, 0x19, 0x44, 0x68, 0x76, 0x76, 0x7b, 0xc9, 0x5a, 0x32, 0x73, 0x64, 0xd6, 0x91, + 0xd9, 0x3d, 0x28, 0xbd, 0x1c, 0xec, 0xbf, 0xae, 0xbc, 0x75, 0x67, 0x77, 0x67, 0xad, 0x4a, 0xa5, + 0xb1, 0x22, 0xcd, 0xc8, 0xff, 0x08, 0xcd, 0xfc, 0xf5, 0x51, 0x78, 0x1c, 0x8c, 0xfe, 0x9d, 0xfb, + 0xd3, 0x1b, 0x1c, 0xac, 0x7a, 0xd2, 0x04, 0x07, 0xbf, 0x99, 0x0c, 0x41, 0x91, 0xef, 0x72, 0xf4, + 0xc2, 0xf2, 0x61, 0x5f, 0x51, 0x74, 0xa8, 0x28, 0xfa, 0xae, 0x28, 0x7a, 0xaf, 0xa9, 0x77, 0xa8, + 0xa9, 0xf7, 0x59, 0x53, 0xef, 0x89, 0x25, 0xca, 0x3e, 0x17, 0x31, 0xdb, 0x40, 0xca, 0x4f, 0xea, + 0x2e, 0x17, 0xfc, 0xf5, 0xa4, 0x73, 0xfb, 0x96, 0x49, 0x13, 0x0f, 0x9b, 0x86, 0x16, 0x3f, 0x01, + 0x00, 0x00, 0xff, 0xff, 0x2a, 0xdf, 0x39, 0x25, 0x9c, 0x01, 0x00, 0x00, } func (m *Delegation) Marshal() (dAtA []byte, err error) { @@ -219,13 +210,6 @@ func (m *Delegation) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - if len(m.ChainID) > 0 { - i -= len(m.ChainID) - copy(dAtA[i:], m.ChainID) - i = encodeVarintDelegate(dAtA, i, uint64(len(m.ChainID))) - i-- - dAtA[i] = 0x12 - } if len(m.Provider) > 0 { i -= len(m.Provider) copy(dAtA[i:], m.Provider) @@ -289,10 +273,6 @@ func (m *Delegation) Size() (n int) { if l > 0 { n += 1 + l + sovDelegate(uint64(l)) } - l = len(m.ChainID) - if l > 0 { - n += 1 + l + sovDelegate(uint64(l)) - } l = len(m.Delegator) if l > 0 { n += 1 + l + sovDelegate(uint64(l)) @@ -387,38 +367,6 @@ func (m *Delegation) Unmarshal(dAtA []byte) error { } m.Provider = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainID", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDelegate - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthDelegate - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthDelegate - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainID = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Delegator", wireType) diff --git a/x/dualstaking/types/delegator_reward.pb.go b/x/dualstaking/types/delegator_reward.pb.go index 3f6469da51..d7e4c02c44 100644 --- a/x/dualstaking/types/delegator_reward.pb.go +++ b/x/dualstaking/types/delegator_reward.pb.go @@ -28,7 +28,6 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type DelegatorReward struct { Delegator string `protobuf:"bytes,1,opt,name=delegator,proto3" json:"delegator,omitempty"` Provider string `protobuf:"bytes,2,opt,name=provider,proto3" json:"provider,omitempty"` - ChainId string `protobuf:"bytes,3,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` Amount github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,4,rep,name=amount,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"amount"` } @@ -79,13 +78,6 @@ func (m *DelegatorReward) GetProvider() string { return "" } -func (m *DelegatorReward) GetChainId() string { - if m != nil { - return m.ChainId - } - return "" -} - func (m *DelegatorReward) GetAmount() github_com_cosmos_cosmos_sdk_types.Coins { if m != nil { return m.Amount @@ -102,26 +94,26 @@ func init() { } var fileDescriptor_c8b6da054bf40d1f = []byte{ - // 301 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x50, 0xbd, 0x4e, 0xf3, 0x30, - 0x14, 0x8d, 0xbf, 0x7e, 0x2a, 0xad, 0x19, 0x90, 0x22, 0x86, 0xb4, 0x42, 0x6e, 0xc5, 0xd4, 0x05, - 0x9b, 0xd2, 0x37, 0x28, 0x0c, 0xb0, 0x76, 0x64, 0xa9, 0x9c, 0xd8, 0x4a, 0xad, 0xb6, 0xbe, 0x95, - 0xed, 0x04, 0x78, 0x0b, 0x9e, 0x83, 0x27, 0xa9, 0xc4, 0xd2, 0x91, 0x09, 0x50, 0xf2, 0x22, 0x28, - 0x4e, 0x28, 0xed, 0x74, 0x73, 0x73, 0xee, 0xf9, 0xf1, 0xc1, 0x6c, 0xc5, 0x73, 0xae, 0xa5, 0xf3, - 0x93, 0x89, 0x8c, 0xaf, 0xac, 0xe3, 0x4b, 0xa5, 0x53, 0x26, 0xe4, 0x4a, 0xa6, 0xdc, 0x81, 0x99, - 0x1b, 0xf9, 0xc4, 0x8d, 0xa0, 0x1b, 0x03, 0x0e, 0xc2, 0xa8, 0x21, 0xd0, 0x6a, 0xd2, 0x03, 0x42, - 0xff, 0x3c, 0x85, 0x14, 0xfc, 0x11, 0xab, 0xbe, 0xea, 0xfb, 0x3e, 0x49, 0xc0, 0xae, 0xc1, 0xb2, - 0x98, 0x5b, 0xc9, 0xf2, 0x71, 0x2c, 0x1d, 0x1f, 0xb3, 0x04, 0x94, 0xae, 0xf1, 0xcb, 0x77, 0x84, - 0xcf, 0xee, 0x7e, 0xad, 0x66, 0xde, 0x29, 0xbc, 0xc0, 0xdd, 0xbd, 0x7b, 0x84, 0x86, 0x68, 0xd4, - 0x9d, 0xfd, 0xfd, 0x08, 0xfb, 0xb8, 0xb3, 0x31, 0x90, 0x2b, 0x21, 0x4d, 0xf4, 0xcf, 0x83, 0xfb, - 0x3d, 0xec, 0xe1, 0x4e, 0xb2, 0xe0, 0x4a, 0xcf, 0x95, 0x88, 0x5a, 0x1e, 0x3b, 0xf1, 0xfb, 0x83, - 0x08, 0x13, 0xdc, 0xe6, 0x6b, 0xc8, 0xb4, 0x8b, 0xfe, 0x0f, 0x5b, 0xa3, 0xd3, 0x9b, 0x1e, 0xad, - 0x93, 0xd1, 0x2a, 0x19, 0x6d, 0x92, 0xd1, 0x5b, 0x50, 0x7a, 0x7a, 0xbd, 0xfd, 0x1c, 0x04, 0x6f, - 0x5f, 0x83, 0x51, 0xaa, 0xdc, 0x22, 0x8b, 0x69, 0x02, 0x6b, 0xd6, 0x3c, 0xa3, 0x1e, 0x57, 0x56, - 0x2c, 0x99, 0x7b, 0xd9, 0x48, 0xeb, 0x09, 0x76, 0xd6, 0x48, 0x4f, 0xef, 0xb7, 0x05, 0x41, 0xbb, - 0x82, 0xa0, 0xef, 0x82, 0xa0, 0xd7, 0x92, 0x04, 0xbb, 0x92, 0x04, 0x1f, 0x25, 0x09, 0x1e, 0xe9, - 0x81, 0xd6, 0x51, 0xe7, 0xf9, 0x84, 0x3d, 0x1f, 0x15, 0xef, 0x75, 0xe3, 0xb6, 0xaf, 0x67, 0xf2, - 0x13, 0x00, 0x00, 0xff, 0xff, 0x46, 0xff, 0xf5, 0xaa, 0xa1, 0x01, 0x00, 0x00, + // 291 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x90, 0x31, 0x4e, 0xfb, 0x30, + 0x18, 0xc5, 0xe3, 0x7f, 0xa3, 0xaa, 0xcd, 0x7f, 0x00, 0x45, 0x0c, 0x21, 0x42, 0x6e, 0xc5, 0x94, + 0x05, 0x9b, 0xd2, 0x1b, 0x14, 0x06, 0xc4, 0x98, 0x91, 0x05, 0x39, 0x89, 0x15, 0xa2, 0x26, 0xfe, + 0x22, 0xdb, 0x09, 0x70, 0x0b, 0xce, 0xc1, 0x01, 0x38, 0x43, 0xc7, 0x8e, 0x4c, 0x80, 0x92, 0x8b, + 0xa0, 0x38, 0xa1, 0xb4, 0xd3, 0xb3, 0xfd, 0x7d, 0xef, 0xfd, 0xac, 0xe7, 0xd0, 0x9c, 0xd5, 0x4c, + 0x70, 0x6d, 0x94, 0x26, 0x15, 0xcb, 0x95, 0x66, 0xeb, 0x4c, 0xa4, 0x34, 0xe1, 0x39, 0x4f, 0x99, + 0x06, 0xf9, 0x20, 0xf9, 0x13, 0x93, 0x09, 0x29, 0x25, 0x68, 0x70, 0xbd, 0xc1, 0x40, 0x3a, 0x25, + 0x7b, 0x06, 0xff, 0x24, 0x85, 0x14, 0xcc, 0x12, 0xed, 0x4e, 0xfd, 0xbe, 0x8f, 0x63, 0x50, 0x05, + 0x28, 0x1a, 0x31, 0xc5, 0x69, 0xbd, 0x88, 0xb8, 0x66, 0x0b, 0x1a, 0x43, 0x26, 0xfa, 0xf9, 0xf9, + 0x3b, 0x72, 0x8e, 0x6e, 0x7e, 0x51, 0xa1, 0x21, 0xb9, 0x67, 0xce, 0x74, 0x47, 0xf7, 0xd0, 0x1c, + 0x05, 0xd3, 0xf0, 0xef, 0xc1, 0xf5, 0x9d, 0x49, 0x29, 0xa1, 0xce, 0x12, 0x2e, 0xbd, 0x7f, 0x66, + 0xb8, 0xbb, 0xbb, 0xb1, 0x33, 0x66, 0x05, 0x54, 0x42, 0x7b, 0xf6, 0x7c, 0x14, 0xfc, 0xbf, 0x3a, + 0x25, 0x3d, 0x9e, 0x74, 0x78, 0x32, 0xe0, 0xc9, 0x35, 0x64, 0x62, 0x75, 0xb9, 0xf9, 0x9c, 0x59, + 0x6f, 0x5f, 0xb3, 0x20, 0xcd, 0xf4, 0x63, 0x15, 0x91, 0x18, 0x0a, 0x3a, 0xfc, 0xb5, 0x97, 0x0b, + 0x95, 0xac, 0xa9, 0x7e, 0x29, 0xb9, 0x32, 0x06, 0x15, 0x0e, 0xd1, 0x77, 0xf6, 0x64, 0x74, 0x6c, + 0xaf, 0x6e, 0x37, 0x0d, 0x46, 0xdb, 0x06, 0xa3, 0xef, 0x06, 0xa3, 0xd7, 0x16, 0x5b, 0xdb, 0x16, + 0x5b, 0x1f, 0x2d, 0xb6, 0xee, 0xc9, 0x5e, 0xe2, 0x41, 0xbd, 0xf5, 0x92, 0x3e, 0x1f, 0x74, 0x6c, + 0xd2, 0xa3, 0xb1, 0x69, 0x62, 0xf9, 0x13, 0x00, 0x00, 0xff, 0xff, 0x3a, 0x84, 0xf0, 0x2c, 0x8c, + 0x01, 0x00, 0x00, } func (m *DelegatorReward) Marshal() (dAtA []byte, err error) { @@ -158,13 +150,6 @@ func (m *DelegatorReward) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x22 } } - if len(m.ChainId) > 0 { - i -= len(m.ChainId) - copy(dAtA[i:], m.ChainId) - i = encodeVarintDelegatorReward(dAtA, i, uint64(len(m.ChainId))) - i-- - dAtA[i] = 0x1a - } if len(m.Provider) > 0 { i -= len(m.Provider) copy(dAtA[i:], m.Provider) @@ -207,10 +192,6 @@ func (m *DelegatorReward) Size() (n int) { if l > 0 { n += 1 + l + sovDelegatorReward(uint64(l)) } - l = len(m.ChainId) - if l > 0 { - n += 1 + l + sovDelegatorReward(uint64(l)) - } if len(m.Amount) > 0 { for _, e := range m.Amount { l = e.Size() @@ -319,38 +300,6 @@ func (m *DelegatorReward) Unmarshal(dAtA []byte) error { } m.Provider = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChainId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowDelegatorReward - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthDelegatorReward - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthDelegatorReward - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChainId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) diff --git a/x/dualstaking/types/genesis.pb.go b/x/dualstaking/types/genesis.pb.go index 1c48861d97..b77bfde476 100644 --- a/x/dualstaking/types/genesis.pb.go +++ b/x/dualstaking/types/genesis.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - types "github.com/lavanet/lava/v3/x/fixationstore/types" + _ "github.com/lavanet/lava/v3/x/fixationstore/types" _ "github.com/lavanet/lava/v3/x/timerstore/types" io "io" math "math" @@ -27,10 +27,8 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // GenesisState defines the dualstaking module's genesis state. type GenesisState struct { - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` - DelegationsFS types.GenesisState `protobuf:"bytes,2,opt,name=delegationsFS,proto3" json:"delegationsFS"` - DelegatorsFS types.GenesisState `protobuf:"bytes,3,opt,name=delegatorsFS,proto3" json:"delegatorsFS"` - DelegatorRewardList []DelegatorReward `protobuf:"bytes,5,rep,name=delegator_reward_list,json=delegatorRewardList,proto3" json:"delegator_reward_list"` + Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` + DelegatorRewardList []DelegatorReward `protobuf:"bytes,5,rep,name=delegator_reward_list,json=delegatorRewardList,proto3" json:"delegator_reward_list"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -73,20 +71,6 @@ func (m *GenesisState) GetParams() Params { return Params{} } -func (m *GenesisState) GetDelegationsFS() types.GenesisState { - if m != nil { - return m.DelegationsFS - } - return types.GenesisState{} -} - -func (m *GenesisState) GetDelegatorsFS() types.GenesisState { - if m != nil { - return m.DelegatorsFS - } - return types.GenesisState{} -} - func (m *GenesisState) GetDelegatorRewardList() []DelegatorReward { if m != nil { return m.DelegatorRewardList @@ -103,28 +87,27 @@ func init() { } var fileDescriptor_d5bca863c53f218f = []byte{ - // 336 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x91, 0x4f, 0x4b, 0xc3, 0x30, - 0x18, 0xc6, 0xdb, 0xfd, 0x43, 0xba, 0x09, 0x52, 0x15, 0xca, 0x0e, 0x75, 0x28, 0xca, 0x76, 0x49, - 0x60, 0xbb, 0x7b, 0x18, 0xa2, 0x22, 0x1e, 0x64, 0xf3, 0xe4, 0x65, 0x64, 0x6b, 0x8c, 0xc1, 0xae, - 0x19, 0xc9, 0xbb, 0x39, 0xbf, 0x85, 0x1f, 0x6b, 0xc7, 0x1d, 0x3d, 0x89, 0xac, 0x5f, 0x44, 0x9a, - 0xc6, 0xb1, 0x08, 0xbd, 0x78, 0x4a, 0x5a, 0x7e, 0xcf, 0x2f, 0x79, 0xf2, 0x7a, 0x17, 0x31, 0x59, - 0x90, 0x84, 0x02, 0xce, 0x56, 0x1c, 0xcd, 0x49, 0xac, 0x80, 0xbc, 0xf2, 0x84, 0x61, 0x46, 0x13, - 0xaa, 0xb8, 0x42, 0x33, 0x29, 0x40, 0xf8, 0x81, 0xe1, 0x50, 0xb6, 0xa2, 0x1d, 0xae, 0x79, 0xc4, - 0x04, 0x13, 0x1a, 0xc2, 0xd9, 0x2e, 0xe7, 0x9b, 0xe7, 0x85, 0xde, 0x19, 0x91, 0x64, 0x6a, 0xb4, - 0xcd, 0x8e, 0x85, 0x3d, 0xf3, 0x25, 0x01, 0x2e, 0x12, 0x05, 0x42, 0xd2, 0xed, 0x97, 0x41, 0xcf, - 0x2c, 0x14, 0xf8, 0x94, 0xca, 0x9c, 0xd3, 0x5b, 0x03, 0xe1, 0xc2, 0x63, 0x23, 0x1a, 0x53, 0x46, - 0x40, 0xc8, 0x91, 0xa4, 0x6f, 0x44, 0x46, 0x79, 0xe0, 0x34, 0x2d, 0x79, 0x8d, 0x9b, 0xbc, 0xe9, - 0x10, 0x08, 0x50, 0xff, 0xd2, 0xab, 0xe5, 0x37, 0x0c, 0xdc, 0x96, 0xdb, 0xae, 0x77, 0x5b, 0xa8, - 0xa8, 0x39, 0x7a, 0xd0, 0x5c, 0xbf, 0xb2, 0xfa, 0x3a, 0x71, 0x06, 0x26, 0xe5, 0x3f, 0x7a, 0xfb, - 0xe6, 0xa8, 0xac, 0xc8, 0xf5, 0x30, 0x28, 0x69, 0x4d, 0xdb, 0xd6, 0x58, 0x4d, 0xd1, 0xee, 0x05, - 0x8c, 0xce, 0x96, 0xf8, 0x03, 0xaf, 0xb1, 0x2d, 0x90, 0x49, 0xcb, 0xff, 0x92, 0x5a, 0x0e, 0x7f, - 0xe2, 0x1d, 0xff, 0x7d, 0x94, 0x51, 0xcc, 0x15, 0x04, 0xd5, 0x56, 0xb9, 0x5d, 0xef, 0x76, 0x8a, - 0x8b, 0x5f, 0xfd, 0xc6, 0x06, 0x3a, 0x65, 0xec, 0x87, 0x91, 0xfd, 0xfb, 0x9e, 0x2b, 0xb8, 0xab, - 0xec, 0x55, 0x0e, 0xaa, 0xfd, 0xdb, 0xd5, 0x26, 0x74, 0xd7, 0x9b, 0xd0, 0xfd, 0xde, 0x84, 0xee, - 0x47, 0x1a, 0x3a, 0xeb, 0x34, 0x74, 0x3e, 0xd3, 0xd0, 0x79, 0x42, 0x8c, 0xc3, 0xcb, 0x7c, 0x8c, - 0x26, 0x62, 0x6a, 0xcf, 0x6e, 0xd1, 0xc3, 0x4b, 0x6b, 0x80, 0xf0, 0x3e, 0xa3, 0x6a, 0x5c, 0xd3, - 0x63, 0xeb, 0xfd, 0x04, 0x00, 0x00, 0xff, 0xff, 0x08, 0x1d, 0xa0, 0x30, 0xb8, 0x02, 0x00, 0x00, + // 311 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0xcb, 0x49, 0x2c, 0x4b, + 0xcc, 0x4b, 0x2d, 0xd1, 0x07, 0xd1, 0xfa, 0x29, 0xa5, 0x89, 0x39, 0xc5, 0x25, 0x89, 0xd9, 0x99, + 0x79, 0xe9, 0xfa, 0xe9, 0xa9, 0x79, 0xa9, 0xc5, 0x99, 0xc5, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, + 0x42, 0x12, 0x50, 0x75, 0x7a, 0x20, 0x5a, 0x0f, 0x49, 0x9d, 0x94, 0x48, 0x7a, 0x7e, 0x7a, 0x3e, + 0x58, 0x91, 0x3e, 0x88, 0x05, 0x51, 0x2f, 0xa5, 0x8a, 0xd3, 0xdc, 0x82, 0xc4, 0xa2, 0xc4, 0x5c, + 0xa8, 0xb1, 0x52, 0x9a, 0x28, 0xca, 0xd2, 0x32, 0x2b, 0x12, 0x4b, 0x32, 0xf3, 0xf3, 0x8a, 0x4b, + 0xf2, 0x8b, 0x52, 0xe1, 0x3c, 0xa8, 0x52, 0x65, 0x14, 0xa5, 0x25, 0x99, 0xb9, 0xa9, 0x45, 0x10, + 0x75, 0x60, 0x26, 0x54, 0x91, 0x3e, 0x4e, 0x6b, 0x53, 0x52, 0x73, 0x52, 0xd3, 0x13, 0x4b, 0xf2, + 0x8b, 0xe2, 0x8b, 0x52, 0xcb, 0x13, 0x8b, 0x52, 0x20, 0x1a, 0x94, 0x8e, 0x32, 0x72, 0xf1, 0xb8, + 0x43, 0x7c, 0x1a, 0x5c, 0x92, 0x58, 0x92, 0x2a, 0x64, 0xc7, 0xc5, 0x06, 0x71, 0xa1, 0x04, 0xa3, + 0x02, 0xa3, 0x06, 0xb7, 0x91, 0x82, 0x1e, 0x2e, 0x9f, 0xeb, 0x05, 0x80, 0xd5, 0x39, 0xb1, 0x9c, + 0xb8, 0x27, 0xcf, 0x10, 0x04, 0xd5, 0x25, 0x94, 0xcc, 0x25, 0x8a, 0x6e, 0x55, 0x7c, 0x4e, 0x66, + 0x71, 0x89, 0x04, 0xab, 0x02, 0xb3, 0x06, 0xb7, 0x91, 0x26, 0x6e, 0xe3, 0x5c, 0x60, 0xda, 0x82, + 0xc0, 0xba, 0xa0, 0xe6, 0x0a, 0xa7, 0xa0, 0x0a, 0xfb, 0x64, 0x16, 0x97, 0x78, 0xb1, 0x70, 0x30, + 0x09, 0x30, 0x7b, 0xb1, 0x70, 0x30, 0x0b, 0xb0, 0x78, 0xb1, 0x70, 0xb0, 0x08, 0xb0, 0x3a, 0x79, + 0x9c, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, + 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x5e, 0x7a, 0x66, 0x49, 0x46, + 0x69, 0x92, 0x5e, 0x72, 0x7e, 0x2e, 0x6a, 0xe8, 0x94, 0x19, 0xeb, 0x57, 0xa0, 0x04, 0x51, 0x49, + 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0x38, 0x60, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, + 0x16, 0xb0, 0x0d, 0x1a, 0x02, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -161,26 +144,6 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x2a } } - { - size, err := m.DelegatorsFS.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.DelegationsFS.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 { size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -213,10 +176,6 @@ func (m *GenesisState) Size() (n int) { _ = l l = m.Params.Size() n += 1 + l + sovGenesis(uint64(l)) - l = m.DelegationsFS.Size() - n += 1 + l + sovGenesis(uint64(l)) - l = m.DelegatorsFS.Size() - n += 1 + l + sovGenesis(uint64(l)) if len(m.DelegatorRewardList) > 0 { for _, e := range m.DelegatorRewardList { l = e.Size() @@ -294,72 +253,6 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegationsFS", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.DelegationsFS.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatorsFS", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.DelegatorsFS.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field DelegatorRewardList", wireType) diff --git a/x/dualstaking/types/genesis_test.go b/x/dualstaking/types/genesis_test.go index 48751c24af..aaa1b556a9 100644 --- a/x/dualstaking/types/genesis_test.go +++ b/x/dualstaking/types/genesis_test.go @@ -25,12 +25,10 @@ func TestGenesisState_Validate(t *testing.T) { { Provider: "p0", Delegator: "d0", - ChainId: "c0", }, { Provider: "p1", Delegator: "d1", - ChainId: "c1", }, }, // this line is used by starport scaffolding # types/genesis/validField @@ -44,12 +42,10 @@ func TestGenesisState_Validate(t *testing.T) { { Provider: "p0", Delegator: "d0", - ChainId: "c0", }, { Provider: "p0", Delegator: "d0", - ChainId: "c0", }, }, }, diff --git a/x/dualstaking/types/keys.go b/x/dualstaking/types/keys.go index b8aaa80a3e..cfa0bc99b5 100644 --- a/x/dualstaking/types/keys.go +++ b/x/dualstaking/types/keys.go @@ -1,7 +1,7 @@ package types import ( - "strings" + "cosmossdk.io/collections" ) const ( @@ -37,24 +37,6 @@ func KeyPrefix(p string) []byte { return []byte(p) } -// DelegationKey returns the key/prefix for the Delegation entry in fixation store. -// Using " " (space) as spearator is safe because Bech32 forbids its use as part of -// the address (and is the only visible character that can be safely used). -// (reference https://en.bitcoin.it/wiki/BIP_0173#Specification) -func DelegationKey(provider, delegator, chainID string) string { - return provider + " " + delegator + " " + chainID -} - -func DelegationKeyDecode(prefix string) (provider, delegator, chainID string) { - split := strings.Split(prefix, " ") - return split[0], split[1], split[2] -} - -// DelegatorKey returns the key/prefix for the Delegator entry in fixation store. -func DelegatorKey(delegator string) string { - return delegator -} - -func DelegatorKeyDecode(prefix string) (delegator string) { - return prefix +func DelegationKey(provider, delegator string) collections.Pair[string, string] { + return collections.Join(provider, delegator) } diff --git a/x/dualstaking/types/message_delegate_test.go b/x/dualstaking/types/message_delegate_test.go index c58d392d9d..5b8916fcc1 100644 --- a/x/dualstaking/types/message_delegate_test.go +++ b/x/dualstaking/types/message_delegate_test.go @@ -6,7 +6,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" legacyerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/lavanet/lava/v3/testutil/sample" - commontypes "github.com/lavanet/lava/v3/utils/common/types" "github.com/stretchr/testify/require" ) @@ -26,7 +25,7 @@ func TestMsgDelegate_ValidateBasic(t *testing.T) { Provider: sample.AccAddress(), Amount: oneCoin, Validator: validator, - ChainID: commontypes.EMPTY_PROVIDER_CHAINID, + ChainID: "", }, err: legacyerrors.ErrInvalidAddress, }, @@ -37,7 +36,7 @@ func TestMsgDelegate_ValidateBasic(t *testing.T) { Provider: "invalid_address", Amount: oneCoin, Validator: validator, - ChainID: commontypes.EMPTY_PROVIDER_CHAINID, + ChainID: "", }, err: legacyerrors.ErrInvalidAddress, }, @@ -48,7 +47,7 @@ func TestMsgDelegate_ValidateBasic(t *testing.T) { Provider: sample.AccAddress(), Amount: oneCoin, Validator: validator, - ChainID: commontypes.EMPTY_PROVIDER_CHAINID, + ChainID: "", }, }, { @@ -58,7 +57,7 @@ func TestMsgDelegate_ValidateBasic(t *testing.T) { Provider: sample.AccAddress(), Amount: sdk.Coin{Denom: "utest", Amount: sdk.NewInt(-1)}, Validator: validator, - ChainID: commontypes.EMPTY_PROVIDER_CHAINID, + ChainID: "", }, err: legacyerrors.ErrInvalidCoins, }, @@ -69,7 +68,7 @@ func TestMsgDelegate_ValidateBasic(t *testing.T) { Provider: sample.AccAddress(), Amount: oneCoin, Validator: "invalid_validator", - ChainID: commontypes.EMPTY_PROVIDER_CHAINID, + ChainID: "", }, err: legacyerrors.ErrInvalidAddress, }, diff --git a/x/dualstaking/types/message_redelegate_test.go b/x/dualstaking/types/message_redelegate_test.go index 164f97457d..d3c2e3e79f 100644 --- a/x/dualstaking/types/message_redelegate_test.go +++ b/x/dualstaking/types/message_redelegate_test.go @@ -6,7 +6,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" legacyerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/lavanet/lava/v3/testutil/sample" - commontypes "github.com/lavanet/lava/v3/utils/common/types" "github.com/stretchr/testify/require" ) @@ -25,8 +24,8 @@ func TestMsgRedelegate_ValidateBasic(t *testing.T) { FromProvider: sample.AccAddress(), ToProvider: sample.AccAddress(), Amount: oneCoin, - FromChainID: commontypes.EMPTY_PROVIDER_CHAINID, - ToChainID: commontypes.EMPTY_PROVIDER_CHAINID, + FromChainID: "", + ToChainID: "", }, err: legacyerrors.ErrInvalidAddress, }, { @@ -36,8 +35,8 @@ func TestMsgRedelegate_ValidateBasic(t *testing.T) { FromProvider: "invalid_address", ToProvider: sample.AccAddress(), Amount: oneCoin, - FromChainID: commontypes.EMPTY_PROVIDER_CHAINID, - ToChainID: commontypes.EMPTY_PROVIDER_CHAINID, + FromChainID: "", + ToChainID: "", }, err: legacyerrors.ErrInvalidAddress, }, { @@ -47,8 +46,8 @@ func TestMsgRedelegate_ValidateBasic(t *testing.T) { FromProvider: sample.AccAddress(), ToProvider: sample.AccAddress(), Amount: oneCoin, - FromChainID: commontypes.EMPTY_PROVIDER_CHAINID, - ToChainID: commontypes.EMPTY_PROVIDER_CHAINID, + FromChainID: "", + ToChainID: "", }, }, { name: "invalid amount", @@ -57,8 +56,8 @@ func TestMsgRedelegate_ValidateBasic(t *testing.T) { FromProvider: sample.AccAddress(), ToProvider: sample.AccAddress(), Amount: sdk.Coin{Denom: "utest", Amount: sdk.NewInt(-1)}, - FromChainID: commontypes.EMPTY_PROVIDER_CHAINID, - ToChainID: commontypes.EMPTY_PROVIDER_CHAINID, + FromChainID: "", + ToChainID: "", }, err: legacyerrors.ErrInvalidCoins, }, diff --git a/x/dualstaking/types/message_unbond_test.go b/x/dualstaking/types/message_unbond_test.go index b18ba40cce..08bcf0dab0 100644 --- a/x/dualstaking/types/message_unbond_test.go +++ b/x/dualstaking/types/message_unbond_test.go @@ -6,7 +6,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" legacyerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/lavanet/lava/v3/testutil/sample" - commontypes "github.com/lavanet/lava/v3/utils/common/types" "github.com/stretchr/testify/require" ) @@ -26,7 +25,7 @@ func TestMsgUnbond_ValidateBasic(t *testing.T) { Provider: sample.AccAddress(), Amount: oneCoin, Validator: validator, - ChainID: commontypes.EMPTY_PROVIDER_CHAINID, + ChainID: "", }, err: legacyerrors.ErrInvalidAddress, }, @@ -37,7 +36,7 @@ func TestMsgUnbond_ValidateBasic(t *testing.T) { Provider: "invalid_address", Amount: oneCoin, Validator: validator, - ChainID: commontypes.EMPTY_PROVIDER_CHAINID, + ChainID: "", }, err: legacyerrors.ErrInvalidAddress, }, @@ -48,7 +47,7 @@ func TestMsgUnbond_ValidateBasic(t *testing.T) { Provider: sample.AccAddress(), Amount: oneCoin, Validator: "invalid_validator", - ChainID: commontypes.EMPTY_PROVIDER_CHAINID, + ChainID: "", }, err: legacyerrors.ErrInvalidAddress, }, @@ -59,7 +58,7 @@ func TestMsgUnbond_ValidateBasic(t *testing.T) { Provider: sample.AccAddress(), Amount: oneCoin, Validator: validator, - ChainID: commontypes.EMPTY_PROVIDER_CHAINID, + ChainID: "", }, }, { @@ -69,7 +68,7 @@ func TestMsgUnbond_ValidateBasic(t *testing.T) { Provider: sample.AccAddress(), Amount: sdk.Coin{Denom: "utest", Amount: sdk.NewInt(-1)}, Validator: validator, - ChainID: commontypes.EMPTY_PROVIDER_CHAINID, + ChainID: "", }, err: legacyerrors.ErrInvalidCoins, }, diff --git a/x/pairing/keeper/cu_tracker_test.go b/x/pairing/keeper/cu_tracker_test.go index eef6daccc7..10f5c2aa44 100644 --- a/x/pairing/keeper/cu_tracker_test.go +++ b/x/pairing/keeper/cu_tracker_test.go @@ -154,7 +154,7 @@ func TestTrackedCuWithDelegations(t *testing.T) { // delegate testStake/2 (with commission=0) -> provider should get 66% of the reward _, delegator := ts.AddAccount(common.CONSUMER, 1, testBalance) - _, err := ts.TxDualstakingDelegate(delegator, provider, ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake/2))) + _, err := ts.TxDualstakingDelegate(delegator, provider, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake/2))) require.NoError(t, err) ts.AdvanceEpoch() @@ -493,7 +493,7 @@ func TestProviderMonthlyPayoutQuery(t *testing.T) { // delegate testStake/2 (with commission=0) -> provider should get 66% of the reward _, delegator := ts.AddAccount(common.CONSUMER, 1, testBalance) - _, err = ts.TxDualstakingDelegate(delegator, provider, ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake/2))) + _, err = ts.TxDualstakingDelegate(delegator, provider, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake/2))) require.NoError(t, err) ts.AdvanceEpoch() ts.AdvanceMonths(1).AdvanceEpoch() // advance first month of delegation so it'll apply @@ -612,7 +612,7 @@ func TestProviderMonthlyPayoutQueryWithContributor(t *testing.T) { // delegate testStake/2 (with commission=0) -> provider should get 66% of the reward _, delegator := ts.AddAccount(common.CONSUMER, 1, testBalance) - _, err = ts.TxDualstakingDelegate(delegator, provider, ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake/2))) + _, err = ts.TxDualstakingDelegate(delegator, provider, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake/2))) require.NoError(t, err) delegationTime := ts.BlockTime() ts.AdvanceEpoch() @@ -622,7 +622,7 @@ func TestProviderMonthlyPayoutQueryWithContributor(t *testing.T) { // now since we want to check the expected reward, before it gets transferred). So, we need to artificially // change the delegations' timestamp to be a month forward fakeTimestamp := ts.BlockTime().AddDate(0, -2, 0) - err = ts.ChangeDelegationTimestamp(provider, delegator, ts.spec.Index, ts.BlockHeight(), ts.GetNextMonth(fakeTimestamp)) + err = ts.ChangeDelegationTimestamp(provider, delegator, ts.BlockHeight(), ts.GetNextMonth(fakeTimestamp)) require.NoError(t, err) // send two relay payments in spec and spec1 @@ -687,7 +687,7 @@ func TestProviderMonthlyPayoutQueryWithContributor(t *testing.T) { // advance month + blocksToSave + 1 to trigger the monthly payment // (also restore delegation original timestamp) oldBalance := ts.GetBalance(providerAcct.Vault.Addr) - err = ts.ChangeDelegationTimestamp(provider, delegator, ts.spec.Index, ts.BlockHeight(), ts.GetNextMonth(delegationTime)) + err = ts.ChangeDelegationTimestamp(provider, delegator, ts.BlockHeight(), ts.GetNextMonth(delegationTime)) require.NoError(t, err) ts.AdvanceMonths(1) diff --git a/x/pairing/keeper/delegator_rewards_test.go b/x/pairing/keeper/delegator_rewards_test.go index fd9ba80d3c..aab6783833 100644 --- a/x/pairing/keeper/delegator_rewards_test.go +++ b/x/pairing/keeper/delegator_rewards_test.go @@ -72,11 +72,11 @@ func TestProviderDelegatorsRewards(t *testing.T) { if amount1.IsZero() { amount1.Amount = sdk.OneInt() } - _, err = ts.TxDualstakingDelegate(delegator1, provider, ts.spec.Index, amount1) + _, err = ts.TxDualstakingDelegate(delegator1, provider, amount1) require.NoError(t, err) amount2 := sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(tt.d2Amount*delegationAmount/100)) - _, err = ts.TxDualstakingDelegate(delegator2, provider, ts.spec.Index, amount2) + _, err = ts.TxDualstakingDelegate(delegator2, provider, amount2) require.NoError(t, err) ts.AdvanceEpoch() // apply delegations @@ -187,7 +187,7 @@ func TestProviderRewardWithCommission(t *testing.T) { ts.AdvanceEpoch() // to apply pairing delegationAmount1 := sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake)) - _, err = ts.TxDualstakingDelegate(delegator1, provider, ts.spec.Index, delegationAmount1) + _, err = ts.TxDualstakingDelegate(delegator1, provider, delegationAmount1) require.NoError(t, err) ts.AdvanceEpoch() // apply delegations @@ -210,7 +210,7 @@ func TestProviderRewardWithCommission(t *testing.T) { currentTimestamp := ts.Ctx.BlockTime().UTC().Unix() relevantDelegations := lavaslices.Filter(res.Delegations, func(d dualstakingtypes.Delegation) bool { - return d.ChainID == ts.spec.Index && d.IsFirstWeekPassed(currentTimestamp) + return d.IsFirstWeekPassed(currentTimestamp) }) totalReward := sdk.NewCoins(sdk.NewCoin(ts.TokenDenom(), math.NewInt(int64(relayCuSum)))) providerReward, _ := ts.Keepers.Dualstaking.CalcRewards(ts.Ctx, stakeEntry, totalReward, relevantDelegations) @@ -306,11 +306,11 @@ func TestQueryDelegatorRewards(t *testing.T) { makeProviderCommissionZero(ts, ts.spec.Index, provider2) delegationAmount := sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake)) - _, err = ts.TxDualstakingDelegate(delegator1, provider1, ts.spec.Index, delegationAmount) + _, err = ts.TxDualstakingDelegate(delegator1, provider1, delegationAmount) require.NoError(t, err) - _, err = ts.TxDualstakingDelegate(delegator1, provider1, spec1.Index, delegationAmount) + _, err = ts.TxDualstakingDelegate(delegator1, provider1, delegationAmount) require.NoError(t, err) - _, err = ts.TxDualstakingDelegate(delegator1, provider2, ts.spec.Index, delegationAmount) + _, err = ts.TxDualstakingDelegate(delegator1, provider2, delegationAmount) require.NoError(t, err) ts.AdvanceEpoch() // apply delegations @@ -430,7 +430,7 @@ func TestDelegationTimestamp(t *testing.T) { // delegate and check the timestamp is equal to current time + month currentTimeAfterMonth := ts.GetNextMonth(ts.BlockTime()) - _, err := ts.TxDualstakingDelegate(delegator, provider, ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake))) + _, err := ts.TxDualstakingDelegate(delegator, provider, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake))) require.NoError(t, err) ts.AdvanceEpoch() // apply delegations @@ -447,7 +447,7 @@ func TestDelegationTimestamp(t *testing.T) { // advance time and delegate again to verify that the timestamp hasn't changed ts.AdvanceMonths(1) expectedDelegation := sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(2*testStake)) - _, err = ts.TxDualstakingDelegate(delegator, provider, ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake))) + _, err = ts.TxDualstakingDelegate(delegator, provider, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake))) require.NoError(t, err) ts.AdvanceEpoch() // apply delegations @@ -481,7 +481,7 @@ func TestDelegationFirstMonthPairing(t *testing.T) { // delegate and check the delegation's timestamp is equal than nowPlusMonthTime nowPlusMonthTime := ts.GetNextMonth(ts.BlockTime()) - _, err := ts.TxDualstakingDelegate(delegator, provider, ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake))) + _, err := ts.TxDualstakingDelegate(delegator, provider, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake))) require.NoError(t, err) ts.AdvanceEpoch() // apply delegations @@ -523,7 +523,7 @@ func TestDelegationFirstMonthReward(t *testing.T) { // delegate and check the delegation's timestamp is equal to nowPlusMonthTime nowPlusMonthTime := ts.GetNextMonth(ts.BlockTime()) - _, err := ts.TxDualstakingDelegate(delegator, provider, ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake))) + _, err := ts.TxDualstakingDelegate(delegator, provider, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake))) require.NoError(t, err) ts.AdvanceEpoch() // apply delegations @@ -578,7 +578,7 @@ func TestRedelegationFirstMonthReward(t *testing.T) { // delegate and check the delegation's timestamp is equal to nowPlusMonthTime nowPlusMonthTime := ts.GetNextMonth(ts.BlockTime()) - _, err := ts.TxDualstakingDelegate(delegator, provider, ts.spec.Index, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake))) + _, err := ts.TxDualstakingDelegate(delegator, provider, sdk.NewCoin(ts.TokenDenom(), sdk.NewInt(testStake))) require.NoError(t, err) ts.AdvanceEpoch() // apply delegations @@ -594,7 +594,7 @@ func TestRedelegationFirstMonthReward(t *testing.T) { // advance a month a redelegate some of the funds to the second provider ts.AdvanceMonths(1) redelegateAmount := sdk.NewCoin(ts.TokenDenom(), res.Delegations[0].Amount.Amount.QuoRaw(2)) - _, err = ts.TxDualstakingRedelegate(delegator, provider, provider1, ts.spec.Index, ts.spec.Index, redelegateAmount) + _, err = ts.TxDualstakingRedelegate(delegator, provider, provider1, redelegateAmount) require.NoError(t, err) // to trigger the payment's code, we need to advance a month+blocksToSave. If we do that, diff --git a/x/pairing/keeper/migrations.go b/x/pairing/keeper/migrations.go index 00b21034ce..bb43ce2ba6 100644 --- a/x/pairing/keeper/migrations.go +++ b/x/pairing/keeper/migrations.go @@ -37,7 +37,7 @@ func (m Migrator) MigrateVersion3To4(ctx sdk.Context) error { delegateTotal := sdk.ZeroInt() for _, d := range delegations { - if e.Address == d.Delegator || e.Vault == d.Delegator || d.ChainID != e.Chain { + if e.Address == d.Delegator || e.Vault == d.Delegator { continue } delegateTotal = delegateTotal.Add(d.Amount.Amount) diff --git a/x/pairing/keeper/msg_server_stake_provider_test.go b/x/pairing/keeper/msg_server_stake_provider_test.go index 161c020c57..c0198fed3d 100644 --- a/x/pairing/keeper/msg_server_stake_provider_test.go +++ b/x/pairing/keeper/msg_server_stake_provider_test.go @@ -761,7 +761,7 @@ func TestUnfreezeWithDelegations(t *testing.T) { // add delegator and delegate to provider so its effective stake is MinStakeProvider+MinSelfDelegation+1 // provider should still be frozen _, consumer := ts.AddAccount(common.CONSUMER, 1, testBalance) - _, err = ts.TxDualstakingDelegate(consumer, provider, ts.spec.Index, ts.spec.MinStakeProvider) + _, err = ts.TxDualstakingDelegate(consumer, provider, ts.spec.MinStakeProvider) require.NoError(t, err) ts.AdvanceEpoch() // apply delegation stakeEntry, found = ts.Keepers.Epochstorage.GetStakeEntryCurrent(ts.Ctx, ts.spec.Index, provider) @@ -801,7 +801,7 @@ func TestCommisionChange(t *testing.T) { // add delegator and delegate to provider _, consumer := ts.AddAccount(common.CONSUMER, 1, testBalance) - _, err = ts.TxDualstakingDelegate(consumer, provider, ts.spec.Index, ts.spec.MinStakeProvider) + _, err = ts.TxDualstakingDelegate(consumer, provider, ts.spec.MinStakeProvider) require.NoError(t, err) ts.AdvanceEpoch() // apply delegation ts.AdvanceBlock(time.Hour * 25) // advance time to allow changes @@ -1126,7 +1126,7 @@ func TestDelegatorStakesAfterProviderUnstakes(t *testing.T) { // create delegator and delegate to provider _, delegator := ts.AddAccount(common.CONSUMER, 0, testBalance) - _, err := ts.TxDualstakingDelegate(delegator, provider, ts.spec.Index, common.NewCoin(ts.TokenDenom(), testBalance/4)) + _, err := ts.TxDualstakingDelegate(delegator, provider, common.NewCoin(ts.TokenDenom(), testBalance/4)) require.NoError(t, err) ts.AdvanceEpoch() @@ -1182,7 +1182,7 @@ func TestDelegatorAfterProviderUnstakeAndStake(t *testing.T) { // create apple apple and delegate to banana _, apple := ts.AddAccount(common.CONSUMER, 0, testBalance) - _, err = ts.TxDualstakingDelegate(apple, banana, ts.spec.Index, common.NewCoin(ts.TokenDenom(), testBalance/4)) + _, err = ts.TxDualstakingDelegate(apple, banana, common.NewCoin(ts.TokenDenom(), testBalance/4)) require.NoError(t, err) ts.AdvanceEpoch() @@ -1211,7 +1211,7 @@ func TestDelegatorAfterProviderUnstakeAndStake(t *testing.T) { require.True(t, found) require.NotZero(t, stakeEntry.DelegateTotal.Amount.Int64()) - _, err = ts.TxDualstakingUnbond(apple, banana, ts.spec.Index, common.NewCoin(ts.TokenDenom(), testBalance/4)) + _, err = ts.TxDualstakingUnbond(apple, banana, common.NewCoin(ts.TokenDenom(), testBalance/4)) require.NoError(t, err) ts.AdvanceEpoch() res, err := ts.QueryDualstakingProviderDelegators(banana, false) @@ -1229,7 +1229,7 @@ func TestDelegatorAfterProviderUnstakeAndStake(t *testing.T) { require.True(t, found) require.Zero(t, stakeEntry.DelegateTotal.Amount.Int64()) - _, err = ts.TxDualstakingUnbond(apple, banana, ts.spec.Index, common.NewCoin(ts.TokenDenom(), testBalance/4)) + _, err = ts.TxDualstakingUnbond(apple, banana, common.NewCoin(ts.TokenDenom(), testBalance/4)) require.NoError(t, err) ts.AdvanceEpoch() res, err := ts.QueryDualstakingProviderDelegators(banana, false) diff --git a/x/pairing/keeper/pairing_test.go b/x/pairing/keeper/pairing_test.go index f1e607aff0..55e1024b95 100644 --- a/x/pairing/keeper/pairing_test.go +++ b/x/pairing/keeper/pairing_test.go @@ -968,7 +968,7 @@ func TestPairingDistributionPerStake(t *testing.T) { // double the stake of the first provider p := allProviders.StakeEntry[0] - _, err = ts.TxDualstakingDelegate(p.Vault, p.Address, ts.spec.Index, p.Stake) + _, err = ts.TxDualstakingDelegate(p.Vault, p.Address, p.Stake) require.NoError(t, err) ts.AdvanceEpoch() diff --git a/x/pairing/keeper/unresponsive_provider_test.go b/x/pairing/keeper/unresponsive_provider_test.go index abaf11842c..28f34f1370 100644 --- a/x/pairing/keeper/unresponsive_provider_test.go +++ b/x/pairing/keeper/unresponsive_provider_test.go @@ -429,7 +429,7 @@ func TestJailProviderForUnresponsiveness(t *testing.T) { // jail first time jailProvider() // try to unfreeze with increase of self delegation - _, err = ts.TxDualstakingDelegate(provider1, provider1, ts.spec.Index, common.NewCoin(ts.TokenDenom(), 1)) + _, err = ts.TxDualstakingDelegate(provider1, provider1, common.NewCoin(ts.TokenDenom(), 1)) require.Nil(t, err) _, err = ts.TxPairingUnfreezeProvider(provider1, ts.spec.Index) @@ -457,7 +457,7 @@ func TestJailProviderForUnresponsiveness(t *testing.T) { // jail third time jailProvider() // try to unfreeze with increase of self delegation - _, err = ts.TxDualstakingDelegate(provider1, provider1, ts.spec.Index, common.NewCoin(ts.TokenDenom(), 1)) + _, err = ts.TxDualstakingDelegate(provider1, provider1, common.NewCoin(ts.TokenDenom(), 1)) require.Nil(t, err) _, err = ts.TxPairingUnfreezeProvider(provider1, ts.spec.Index) diff --git a/x/pairing/keeper/unstaking_test.go b/x/pairing/keeper/unstaking_test.go index cff2bf2537..edcf11536d 100644 --- a/x/pairing/keeper/unstaking_test.go +++ b/x/pairing/keeper/unstaking_test.go @@ -24,7 +24,7 @@ func TestUnstakeAndSlashProposal(t *testing.T) { for i := 0; i < delegators; i++ { _, delegator := ts.GetAccount(common.CONSUMER, i) beforeSlashDelegation[delegator] = sdk.NewInt(1000 * int64(i+1)) - _, err := ts.TxDualstakingDelegate(delegator, provider, ts.spec.Index, sdk.NewCoin(ts.BondDenom(), beforeSlashDelegation[delegator])) + _, err := ts.TxDualstakingDelegate(delegator, provider, sdk.NewCoin(ts.BondDenom(), beforeSlashDelegation[delegator])) require.NoError(t, err) delegatorsSlashing = append(delegatorsSlashing, types.DelegatorSlashing{Delegator: delegator, SlashingAmount: sdk.NewCoin(ts.BondDenom(), sdk.NewInt(1000/3*int64(i+1)))}) } From a8c1e6819c56930cac149fd6781b19c934312bfc Mon Sep 17 00:00:00 2001 From: Yaroms Date: Wed, 11 Sep 2024 18:04:55 +0300 Subject: [PATCH 02/27] handle rewards --- app/app.go | 36 --- app/upgrades/empty_upgrades.go | 261 ------------------ app/upgrades/upgrade_0_32_0.go | 69 ----- testutil/keeper/keepers_init.go | 2 - x/dualstaking/keeper/delegator_reward.go | 70 ++--- x/dualstaking/keeper/delegator_reward_test.go | 11 +- .../keeper/grpc_query_delegator_rewards.go | 7 +- x/dualstaking/keeper/keeper.go | 1 + x/dualstaking/keeper/migrations.go | 40 --- x/dualstaking/keeper/msg_server_unbond.go | 5 +- x/dualstaking/module.go | 12 +- x/dualstaking/types/key_delegator_reward.go | 23 -- x/pairing/keeper/migrations.go | 35 --- x/pairing/keeper/staking.go | 10 +- x/pairing/keeper/unstaking.go | 4 +- x/pairing/module.go | 8 +- x/pairing/types/expected_keepers.go | 6 +- .../keeper/grpc_query_estimated_rewards.go | 2 +- x/subscription/types/expected_keepers.go | 2 +- 19 files changed, 55 insertions(+), 549 deletions(-) delete mode 100644 app/upgrades/upgrade_0_32_0.go delete mode 100644 x/dualstaking/types/key_delegator_reward.go diff --git a/app/app.go b/app/app.go index 7297ef3b99..54dfedb250 100644 --- a/app/app.go +++ b/app/app.go @@ -166,42 +166,6 @@ const ( // Upgrades add here future upgrades (upgrades.Upgrade) var Upgrades = []upgrades.Upgrade{ - upgrades.Upgrade_0_22_0, - upgrades.Upgrade_0_23_0, - upgrades.Upgrade_0_23_2, - upgrades.Upgrade_0_23_4, - upgrades.Upgrade_0_23_5, - upgrades.Upgrade_0_24_0, - upgrades.Upgrade_0_25_0, - upgrades.Upgrade_0_25_1, - upgrades.Upgrade_0_25_2, - upgrades.Upgrade_0_26_0, - upgrades.Upgrade_0_26_1, - upgrades.Upgrade_0_26_2, - upgrades.Upgrade_0_27_0, - upgrades.Upgrade_0_30_0, - upgrades.Upgrade_0_30_1, - upgrades.Upgrade_0_30_2, - upgrades.Upgrade_0_31_0, - upgrades.Upgrade_0_31_1, - upgrades.Upgrade_0_32_0, - upgrades.Upgrade_0_32_3, - upgrades.Upgrade_0_33_0, - upgrades.Upgrade_0_34_0, - upgrades.Upgrade_0_35_0, - upgrades.Upgrade_1_0_0, - upgrades.Upgrade_1_0_1, - upgrades.Upgrade_1_1_0, - upgrades.Upgrade_1_2_0, - upgrades.Upgrade_2_0_0, - upgrades.Upgrade_2_1_0, - upgrades.Upgrade_2_1_1, - upgrades.Upgrade_2_1_3, - upgrades.Upgrade_2_2_0, - upgrades.Upgrade_2_4_0, - upgrades.Upgrade_2_5_0, - upgrades.Upgrade_3_0_0, - upgrades.Upgrade_3_0_1, upgrades.Upgrade_3_1_0, } diff --git a/app/upgrades/empty_upgrades.go b/app/upgrades/empty_upgrades.go index 348fd31622..1b18de859a 100644 --- a/app/upgrades/empty_upgrades.go +++ b/app/upgrades/empty_upgrades.go @@ -4,19 +4,8 @@ import ( store "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" - authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - "github.com/cosmos/cosmos-sdk/x/group" - minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - packetforwardtypes "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v7/packetforward/types" - icacontrollertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types" - icahosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types" "github.com/lavanet/lava/v3/app/keepers" - v1 "github.com/lavanet/lava/v3/x/downtime/v1" - dualstakingtypes "github.com/lavanet/lava/v3/x/dualstaking/types" - fixationtypes "github.com/lavanet/lava/v3/x/fixationstore/types" - protocoltypes "github.com/lavanet/lava/v3/x/protocol/types" - rewardstypes "github.com/lavanet/lava/v3/x/rewards/types" ) func defaultUpgradeHandler( @@ -45,256 +34,6 @@ func defaultUpgradeHandler( // }, // } -var Upgrade_0_22_0 = Upgrade{ - UpgradeName: "v0.22.0", - CreateUpgradeHandler: v0_22_0_UpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -func v0_22_0_UpgradeHandler( - m *module.Manager, - c module.Configurator, - bapm BaseAppParamManager, - lk *keepers.LavaKeepers, -) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, plan upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - lk.DowntimeKeeper.SetParams(ctx, v1.DefaultParams()) - lk.ProtocolKeeper.SetParams(ctx, protocoltypes.DefaultParams()) - return m.RunMigrations(ctx, c, vm) - } -} - -var Upgrade_0_23_0 = Upgrade{ - UpgradeName: "v0.23.0", - CreateUpgradeHandler: v0_23_0_UpgradeHandler, - StoreUpgrades: store.StoreUpgrades{Added: []string{dualstakingtypes.StoreKey}}, -} - -func v0_23_0_UpgradeHandler( - m *module.Manager, - c module.Configurator, - bapm BaseAppParamManager, - lk *keepers.LavaKeepers, -) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, plan upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - lk.PairingKeeper.InitProviderQoS(ctx, *fixationtypes.DefaultGenesis()) - return m.RunMigrations(ctx, c, vm) - } -} - -var Upgrade_0_23_2 = Upgrade{ - UpgradeName: "v0.23.2", // upgrade name - CreateUpgradeHandler: defaultUpgradeHandler, // upgrade handler (default) - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_23_4 = Upgrade{ - UpgradeName: "v0.23.4", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_23_5 = Upgrade{ - UpgradeName: "v0.23.5", - CreateUpgradeHandler: v0_23_0_UpgradeHandler, - StoreUpgrades: store.StoreUpgrades{Added: []string{dualstakingtypes.StoreKey}}, -} - -var Upgrade_0_24_0 = Upgrade{ - UpgradeName: "v0.24.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_25_0 = Upgrade{ - UpgradeName: "v0.25.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_25_1 = Upgrade{ - UpgradeName: "v0.25.1", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_25_2 = Upgrade{ - UpgradeName: "v0.25.2", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_26_0 = Upgrade{ - UpgradeName: "v0.26.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_26_1 = Upgrade{ - UpgradeName: "v0.26.1", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_26_2 = Upgrade{ - UpgradeName: "v0.26.2", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_27_0 = Upgrade{ - UpgradeName: "v0.27.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_30_0 = Upgrade{ - UpgradeName: "v0.30.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_30_1 = Upgrade{ - UpgradeName: "v0.30.1", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_30_2 = Upgrade{ - UpgradeName: "v0.30.2", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_31_0 = Upgrade{ - UpgradeName: "v0.31.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_31_1 = Upgrade{ - UpgradeName: "v0.31.1", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_32_0 = Upgrade{ - UpgradeName: "v0.32.0", - CreateUpgradeHandler: v0_32_0_UpgradeHandler, - StoreUpgrades: store.StoreUpgrades{ - Added: []string{rewardstypes.StoreKey}, - Deleted: []string{minttypes.StoreKey}, - }, -} - -var Upgrade_0_32_3 = Upgrade{ - UpgradeName: "v0.32.3", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_33_0 = Upgrade{ - UpgradeName: "v0.33.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_0_34_0 = Upgrade{ - UpgradeName: "v0.34.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{ - Added: []string{icahosttypes.StoreKey, icacontrollertypes.StoreKey}, - }, -} - -var Upgrade_0_35_0 = Upgrade{ - UpgradeName: "v0.35.0", - CreateUpgradeHandler: v_35_0, - StoreUpgrades: store.StoreUpgrades{Added: []string{authzkeeper.StoreKey, group.StoreKey}}, -} - -var Upgrade_1_0_0 = Upgrade{ - UpgradeName: "v1.0.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_1_0_1 = Upgrade{ - UpgradeName: "v1.0.1", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_1_1_0 = Upgrade{ - UpgradeName: "v1.1.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_1_2_0 = Upgrade{ - UpgradeName: "v1.2.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_2_0_0 = Upgrade{ - UpgradeName: "v2.0.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{ - Added: []string{packetforwardtypes.StoreKey}, - }, -} - -var Upgrade_2_1_0 = Upgrade{ - UpgradeName: "v2.1.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_2_1_1 = Upgrade{ - UpgradeName: "v2.1.1", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_2_1_3 = Upgrade{ - UpgradeName: "v2.1.3", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_2_2_0 = Upgrade{ - UpgradeName: "v2.2.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{ - Added: []string{packetforwardtypes.StoreKey}, - }, -} - -var Upgrade_2_4_0 = Upgrade{ - UpgradeName: "v2.4.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_2_5_0 = Upgrade{ - UpgradeName: "v2.5.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_3_0_0 = Upgrade{ - UpgradeName: "v3.0.0", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - -var Upgrade_3_0_1 = Upgrade{ - UpgradeName: "v3.0.1", - CreateUpgradeHandler: defaultUpgradeHandler, - StoreUpgrades: store.StoreUpgrades{}, -} - var Upgrade_3_1_0 = Upgrade{ UpgradeName: "v3.1.0", CreateUpgradeHandler: defaultUpgradeHandler, diff --git a/app/upgrades/upgrade_0_32_0.go b/app/upgrades/upgrade_0_32_0.go deleted file mode 100644 index 79eb7971c8..0000000000 --- a/app/upgrades/upgrade_0_32_0.go +++ /dev/null @@ -1,69 +0,0 @@ -package upgrades - -import ( - "fmt" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/x/bank/types" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/lavanet/lava/v3/app/keepers" - dualstakingtypes "github.com/lavanet/lava/v3/x/dualstaking/types" - rewardstypes "github.com/lavanet/lava/v3/x/rewards/types" -) - -func v0_32_0_UpgradeHandler( - m *module.Manager, - c module.Configurator, - bapm BaseAppParamManager, - lk *keepers.LavaKeepers, -) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, plan upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { - // rewards pool - totalSupply, err := lk.BankKeeper.TotalSupply(ctx, &types.QueryTotalSupplyRequest{}) - if err != nil { - return nil, err - } - allocate := totalSupply.Supply.QuoInt(sdk.NewIntFromUint64(33)) - err = lk.BankKeeper.MintCoins(ctx, string(rewardstypes.ValidatorsRewardsAllocationPoolName), allocate) - if err != nil { - return nil, err - } - err = lk.BankKeeper.MintCoins(ctx, string(rewardstypes.ProvidersRewardsAllocationPool), allocate) - if err != nil { - return nil, err - } - - rewards := lk.DualstakingKeeper.GetAllDelegatorReward(ctx) - for _, reward := range rewards { - lk.DualstakingKeeper.RemoveDelegatorReward(ctx, dualstakingtypes.DelegationKey(reward.Provider, reward.Delegator, reward.ChainId)) - } - rewards = lk.DualstakingKeeper.GetAllDelegatorReward(ctx) - if len(rewards) != 0 { - return nil, fmt.Errorf("v0.32.0 UpgradeHandler: did not delete all rewards") - } - - // expedited proposal - // deposit - params := lk.GovKeeper.GetParams(ctx) - params.ExpeditedMinDeposit = append(params.ExpeditedMinDeposit, params.MinDeposit[0].AddAmount(sdk.NewIntFromUint64(1000))) - - // tally - params.ExpeditedThreshold = "0.75" - - // voting - seconds := params.VotingPeriod.Nanoseconds() - duration := time.Duration(seconds/10) * time.Nanosecond - params.ExpeditedVotingPeriod = &duration - - if err = params.ValidateBasic(); err != nil { - return nil, err - } - - if err := lk.GovKeeper.SetParams(ctx, params); err != nil { - return nil, err - } - return m.RunMigrations(ctx, c, vm) - } -} diff --git a/testutil/keeper/keepers_init.go b/testutil/keeper/keepers_init.go index 03a6f5f336..247aa2ab5a 100644 --- a/testutil/keeper/keepers_init.go +++ b/testutil/keeper/keepers_init.go @@ -335,8 +335,6 @@ func InitAllKeepers(t testing.TB) (*Servers, *Keepers, context.Context) { ctx = ctx.WithBlockTime(fixedDate) } - ks.Dualstaking.InitDelegations(ctx, *fixationtypes.DefaultGenesis()) - ks.Dualstaking.InitDelegators(ctx, *fixationtypes.DefaultGenesis()) ks.Plans.InitPlans(ctx, *fixationtypes.DefaultGenesis()) ks.Subscription.InitSubscriptions(ctx, *fixationtypes.DefaultGenesis()) ks.Subscription.InitSubscriptionsTimers(ctx, *timerstoretypes.DefaultGenesis()) diff --git a/x/dualstaking/keeper/delegator_reward.go b/x/dualstaking/keeper/delegator_reward.go index 0f2d10387a..770ba75fa1 100644 --- a/x/dualstaking/keeper/delegator_reward.go +++ b/x/dualstaking/keeper/delegator_reward.go @@ -4,7 +4,6 @@ import ( "strconv" "cosmossdk.io/math" - "github.com/cosmos/cosmos-sdk/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/lavanet/lava/v3/utils" "github.com/lavanet/lava/v3/utils/lavaslices" @@ -15,57 +14,42 @@ import ( // SetDelegatorReward set a specific DelegatorReward in the store from its index func (k Keeper) SetDelegatorReward(ctx sdk.Context, delegatorReward types.DelegatorReward) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.DelegatorRewardKeyPrefix)) - index := types.DelegationKey(delegatorReward.Provider, delegatorReward.Delegator) - b := k.cdc.MustMarshal(&delegatorReward) - store.Set(types.DelegatorRewardKey( - index, - ), b) + err := k.rewards.Set(ctx, types.DelegationKey(delegatorReward.Provider, delegatorReward.Provider), delegatorReward) + if err != nil { + panic(err) + } } // GetDelegatorReward returns a DelegatorReward from its index -func (k Keeper) GetDelegatorReward( - ctx sdk.Context, - index string, -) (val types.DelegatorReward, found bool) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.DelegatorRewardKeyPrefix)) - - b := store.Get(types.DelegatorRewardKey( - index, - )) - if b == nil { - return val, false - } - - k.cdc.MustUnmarshal(b, &val) - return val, true +func (k Keeper) GetDelegatorReward(ctx sdk.Context, provider, delegator string) (val types.DelegatorReward, found bool) { + val, err := k.rewards.Get(ctx, types.DelegationKey(provider, delegator)) + return val, err == nil } // RemoveDelegatorReward removes a DelegatorReward from the store func (k Keeper) RemoveDelegatorReward( ctx sdk.Context, - index string, + provider, delegator string, ) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.DelegatorRewardKeyPrefix)) - store.Delete(types.DelegatorRewardKey( - index, - )) + err := k.rewards.Remove(ctx, types.DelegationKey(provider, delegator)) + if err != nil { + panic(err) + } } // GetAllDelegatorReward returns all DelegatorReward func (k Keeper) GetAllDelegatorReward(ctx sdk.Context) (list []types.DelegatorReward) { - store := prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.DelegatorRewardKeyPrefix)) - iterator := sdk.KVStorePrefixIterator(store, []byte{}) - - defer iterator.Close() + iter, err := k.rewards.Iterate(ctx, nil) + if err != nil { + panic(err) + } - for ; iterator.Valid(); iterator.Next() { - var val types.DelegatorReward - k.cdc.MustUnmarshal(iterator.Value(), &val) - list = append(list, val) + list, err = iter.Values() + if err != nil { + panic(err) } - return + return list } // The reward for servicing a consumer is divided between the provider and its delegators. @@ -136,9 +120,7 @@ func (k Keeper) ClaimRewards(ctx sdk.Context, delegator string, provider string) rewardCoins := sdk.NewCoins() for _, reward := range res.Rewards { rewardCoins = rewardCoins.Add(reward.Amount...) - - ind := types.DelegationKey(reward.Provider, delegator, reward.ChainId) - k.RemoveDelegatorReward(ctx, ind) + k.RemoveDelegatorReward(ctx, reward.Provider, delegator) } // not minting new coins because they're minted when the provider @@ -172,7 +154,7 @@ func (k Keeper) RewardProvidersAndDelegators(ctx sdk.Context, provider string, c return zeroCoins, zeroCoins, err } - delegations, err := k.GetProviderDelegators(ctx, provider, epoch) + delegations, err := k.GetProviderDelegators(ctx, provider) if err != nil { return zeroCoins, zeroCoins, utils.LavaFormatError("cannot get provider's delegators", err) } @@ -195,7 +177,7 @@ func (k Keeper) RewardProvidersAndDelegators(ctx sdk.Context, provider string, c relevantDelegations := lavaslices.Filter(delegations, func(d types.Delegation) bool { - return d.ChainID == chainID && d.IsFirstWeekPassed(ctx.BlockTime().UTC().Unix()) && d.Delegator != stakeEntry.Vault + return d.IsFirstWeekPassed(ctx.BlockTime().UTC().Unix()) && d.Delegator != stakeEntry.Vault }) providerReward, delegatorsReward := k.CalcRewards(ctx, stakeEntry, claimableRewards, relevantDelegations) @@ -205,7 +187,7 @@ func (k Keeper) RewardProvidersAndDelegators(ctx sdk.Context, provider string, c if !calcOnlyProvider { // reward provider's vault - k.rewardDelegator(ctx, types.Delegation{Provider: stakeEntry.Address, ChainID: chainID, Delegator: stakeEntry.Vault}, fullProviderReward, senderModule) + k.rewardDelegator(ctx, types.Delegation{Provider: stakeEntry.Address, Delegator: stakeEntry.Vault}, fullProviderReward, senderModule) } return fullProviderReward, claimableRewards, nil @@ -233,12 +215,10 @@ func (k Keeper) rewardDelegator(ctx sdk.Context, delegation types.Delegation, am return } - rewardMapKey := types.DelegationKey(delegation.Provider, delegation.Delegator, delegation.ChainID) - delegatorReward, found := k.GetDelegatorReward(ctx, rewardMapKey) + delegatorReward, found := k.GetDelegatorReward(ctx, delegation.Provider, delegation.Delegator) if !found { delegatorReward.Provider = delegation.Provider delegatorReward.Delegator = delegation.Delegator - delegatorReward.ChainId = delegation.ChainID delegatorReward.Amount = amount } else { delegatorReward.Amount = delegatorReward.Amount.Add(amount...) diff --git a/x/dualstaking/keeper/delegator_reward_test.go b/x/dualstaking/keeper/delegator_reward_test.go index 3d8333e10a..f5d2a3237b 100644 --- a/x/dualstaking/keeper/delegator_reward_test.go +++ b/x/dualstaking/keeper/delegator_reward_test.go @@ -29,10 +29,8 @@ func TestDelegatorRewardGet(t *testing.T) { keeper, ctx := keepertest.DualstakingKeeper(t) items := createNDelegatorReward(keeper, ctx, 10) for _, item := range items { - index := types.DelegationKey(item.Provider, item.Delegator) rst, found := keeper.GetDelegatorReward(ctx, - index, - ) + item.Provider, item.Delegator) require.True(t, found) require.Equal(t, nullify.Fill(&item), @@ -45,13 +43,10 @@ func TestDelegatorRewardRemove(t *testing.T) { keeper, ctx := keepertest.DualstakingKeeper(t) items := createNDelegatorReward(keeper, ctx, 10) for _, item := range items { - index := types.DelegationKey(item.Provider, item.Delegator, item.ChainId) keeper.RemoveDelegatorReward(ctx, - index, - ) + item.Provider, item.Delegator) _, found := keeper.GetDelegatorReward(ctx, - index, - ) + item.Provider, item.Delegator) require.False(t, found) } } diff --git a/x/dualstaking/keeper/grpc_query_delegator_rewards.go b/x/dualstaking/keeper/grpc_query_delegator_rewards.go index bea3ab4281..36dcd1a84b 100644 --- a/x/dualstaking/keeper/grpc_query_delegator_rewards.go +++ b/x/dualstaking/keeper/grpc_query_delegator_rewards.go @@ -23,14 +23,11 @@ func (k Keeper) DelegatorRewards(goCtx context.Context, req *types.QueryDelegato } for _, delegation := range resProviders.Delegations { - if (delegation.ChainID == req.ChainId || req.ChainId == "") && - (delegation.Provider == req.Provider || req.Provider == "") { - ind := types.DelegationKey(delegation.Provider, req.Delegator, delegation.ChainID) - delegatorReward, found := k.GetDelegatorReward(ctx, ind) + if delegation.Provider == req.Provider || req.Provider == "" { + delegatorReward, found := k.GetDelegatorReward(ctx, delegation.Provider, delegation.Delegator) if found { reward := types.DelegatorRewardInfo{ Provider: delegation.Provider, - ChainId: delegation.ChainID, Amount: delegatorReward.Amount, } rewards = append(rewards, reward) diff --git a/x/dualstaking/keeper/keeper.go b/x/dualstaking/keeper/keeper.go index 9b5223143f..310a317a28 100644 --- a/x/dualstaking/keeper/keeper.go +++ b/x/dualstaking/keeper/keeper.go @@ -28,6 +28,7 @@ type ( specKeeper types.SpecKeeper delegations *collections.IndexedMap[collections.Pair[string, string], types.Delegation, types.DelegationIndexes] + rewards *collections.Map[collections.Pair[string, string], types.DelegatorReward] } ) diff --git a/x/dualstaking/keeper/migrations.go b/x/dualstaking/keeper/migrations.go index 3e8254a8d3..c5a2b6fb67 100644 --- a/x/dualstaking/keeper/migrations.go +++ b/x/dualstaking/keeper/migrations.go @@ -2,12 +2,6 @@ package keeper import ( _ "embed" - - "github.com/cosmos/cosmos-sdk/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - dualstakingv4 "github.com/lavanet/lava/v3/x/dualstaking/migrations/v4" - dualstakingtypes "github.com/lavanet/lava/v3/x/dualstaking/types" - "github.com/lavanet/lava/v3/x/pairing/types" ) type Migrator struct { @@ -17,37 +11,3 @@ type Migrator struct { func NewMigrator(keeper Keeper) Migrator { return Migrator{keeper: keeper} } - -// MigrateVersion4To5 change the DelegatorReward object amount's field from sdk.Coin to sdk.Coins -func (m Migrator) MigrateVersion4To5(ctx sdk.Context) error { - delegatorRewards := m.GetAllDelegatorRewardV4(ctx) - for _, dr := range delegatorRewards { - delegatorReward := dualstakingtypes.DelegatorReward{ - Delegator: dr.Delegator, - Provider: dr.Provider, - ChainId: dr.ChainId, - Amount: sdk.NewCoins(dr.Amount), - } - m.keeper.RemoveDelegatorReward(ctx, dualstakingtypes.DelegationKey(dr.Provider, dr.Delegator, dr.ChainId)) - m.keeper.SetDelegatorReward(ctx, delegatorReward) - } - - params := dualstakingtypes.DefaultParams() - m.keeper.SetParams(ctx, params) - return nil -} - -func (m Migrator) GetAllDelegatorRewardV4(ctx sdk.Context) (list []dualstakingv4.DelegatorRewardv4) { - store := prefix.NewStore(ctx.KVStore(m.keeper.storeKey), types.KeyPrefix(dualstakingtypes.DelegatorRewardKeyPrefix)) - iterator := sdk.KVStorePrefixIterator(store, []byte{}) - - defer iterator.Close() - - for ; iterator.Valid(); iterator.Next() { - var val dualstakingv4.DelegatorRewardv4 - m.keeper.cdc.MustUnmarshal(iterator.Value(), &val) - list = append(list, val) - } - - return -} diff --git a/x/dualstaking/keeper/msg_server_unbond.go b/x/dualstaking/keeper/msg_server_unbond.go index 92f4717c85..034940c1f9 100644 --- a/x/dualstaking/keeper/msg_server_unbond.go +++ b/x/dualstaking/keeper/msg_server_unbond.go @@ -11,11 +11,11 @@ import ( func (k msgServer) Unbond(goCtx context.Context, msg *types.MsgUnbond) (*types.MsgUnbondResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - return &types.MsgUnbondResponse{}, k.Keeper.UnbondFull(ctx, msg.Creator, msg.Validator, msg.Provider, msg.ChainID, msg.Amount, false) + return &types.MsgUnbondResponse{}, k.Keeper.UnbondFull(ctx, msg.Creator, msg.Validator, msg.Provider, msg.Amount, false) } // UnbondFul uses staking module for to unbond with hooks -func (k Keeper) UnbondFull(ctx sdk.Context, delegator string, validator string, provider string, chainID string, amount sdk.Coin, unstake bool) error { +func (k Keeper) UnbondFull(ctx sdk.Context, delegator string, validator string, provider string, amount sdk.Coin, unstake bool) error { // 1.redelegate from the provider to the empty provider // 2.calls staking module to unbond from the validator // 3.calls the hooks to than unbond from the empty provider @@ -59,7 +59,6 @@ func (k Keeper) UnbondFull(ctx sdk.Context, delegator string, validator string, details := map[string]string{ "delegator": delegator, "provider": provider, - "chainID": chainID, "amount": amount.String(), } utils.LogLavaEvent(ctx, logger, types.UnbondingEventName, details, "Unbond") diff --git a/x/dualstaking/module.go b/x/dualstaking/module.go index 977359096f..bca81034d7 100644 --- a/x/dualstaking/module.go +++ b/x/dualstaking/module.go @@ -116,13 +116,13 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) types.RegisterQueryServer(cfg.QueryServer(), am.keeper) - migrator := keeper.NewMigrator(am.keeper) + // migrator := keeper.NewMigrator(am.keeper) - // register v4 -> v5 migration - if err := cfg.RegisterMigration(types.ModuleName, 4, migrator.MigrateVersion4To5); err != nil { - // panic:ok: at start up, migration cannot proceed anyhow - panic(fmt.Errorf("%s: failed to register migration to v5: %w", types.ModuleName, err)) - } + // // register v4 -> v5 migration + // if err := cfg.RegisterMigration(types.ModuleName, 4, migrator.MigrateVersion4To5); err != nil { + // // panic:ok: at start up, migration cannot proceed anyhow + // panic(fmt.Errorf("%s: failed to register migration to v5: %w", types.ModuleName, err)) + // } } // RegisterInvariants registers the invariants of the module. If an invariant deviates from its predicted value, the InvariantRegistry triggers appropriate logic (most often the chain will be halted) diff --git a/x/dualstaking/types/key_delegator_reward.go b/x/dualstaking/types/key_delegator_reward.go deleted file mode 100644 index 7bf7db8cb7..0000000000 --- a/x/dualstaking/types/key_delegator_reward.go +++ /dev/null @@ -1,23 +0,0 @@ -package types - -import "encoding/binary" - -var _ binary.ByteOrder - -const ( - // DelegatorRewardKeyPrefix is the prefix to retrieve all DelegatorReward - DelegatorRewardKeyPrefix = "DelegatorReward/value/" -) - -// DelegatorRewardKey returns the store key to retrieve a DelegatorReward from the index fields -func DelegatorRewardKey( - index string, -) []byte { - var key []byte - - indexBytes := []byte(index) - key = append(key, indexBytes...) - key = append(key, []byte("/")...) - - return key -} diff --git a/x/pairing/keeper/migrations.go b/x/pairing/keeper/migrations.go index bb43ce2ba6..fa445503f3 100644 --- a/x/pairing/keeper/migrations.go +++ b/x/pairing/keeper/migrations.go @@ -1,10 +1,7 @@ package keeper import ( - "fmt" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/lavanet/lava/v3/utils" v2 "github.com/lavanet/lava/v3/x/pairing/migrations/v2" ) @@ -23,35 +20,3 @@ func (m Migrator) MigrateVersion2To3(ctx sdk.Context) error { v2.RemoveAllEpochPayments(ctx, m.keeper.storeKey) return nil } - -// MigrateVersion3To4 fix delegation total in the stake entries -func (m Migrator) MigrateVersion3To4(ctx sdk.Context) error { - entries := m.keeper.epochStorageKeeper.GetAllStakeEntriesCurrent(ctx) - epoch := m.keeper.epochStorageKeeper.GetCurrentNextEpoch(ctx) - for _, e := range entries { - delegations, err := m.keeper.dualstakingKeeper.GetProviderDelegators(ctx, e.Address, epoch) - if err != nil { - utils.LavaFormatError("failed getting provider delegators at MigrateVersion3To4", err, utils.LogAttr("provider", e.Address)) - continue - } - - delegateTotal := sdk.ZeroInt() - for _, d := range delegations { - if e.Address == d.Delegator || e.Vault == d.Delegator { - continue - } - delegateTotal = delegateTotal.Add(d.Amount.Amount) - } - if !e.DelegateTotal.Amount.Equal(delegateTotal) { - fmt.Println("fixing delegate total for", e.Address, e.Chain) - - e.DelegateTotal.Amount = delegateTotal - if e.TotalStake().LT(m.keeper.specKeeper.GetMinStake(ctx, e.Chain).Amount) { - e.Freeze() - } - m.keeper.epochStorageKeeper.SetStakeEntryCurrent(ctx, e) - } - } - - return nil -} diff --git a/x/pairing/keeper/staking.go b/x/pairing/keeper/staking.go index 5f4d179e7c..05038e12ec 100644 --- a/x/pairing/keeper/staking.go +++ b/x/pairing/keeper/staking.go @@ -159,7 +159,7 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin if amount.Amount.GT(existingEntry.Stake.Amount) { // delegate the difference diffAmount := amount.Sub(existingEntry.Stake) - err = k.dualstakingKeeper.DelegateFull(ctx, existingEntry.Vault, validator, existingEntry.Address, chainID, diffAmount) + err = k.dualstakingKeeper.DelegateFull(ctx, existingEntry.Vault, validator, existingEntry.Address, diffAmount) if err != nil { details = append(details, utils.Attribute{Key: "neededStake", Value: amount.Sub(existingEntry.Stake).String()}) return utils.LavaFormatWarning("insufficient funds to pay for difference in stake", err, @@ -169,7 +169,7 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin } else if amount.Amount.LT(existingEntry.Stake.Amount) { // unbond the difference diffAmount := existingEntry.Stake.Sub(amount) - err = k.dualstakingKeeper.UnbondFull(ctx, existingEntry.Vault, validator, existingEntry.Address, chainID, diffAmount, false) + err = k.dualstakingKeeper.UnbondFull(ctx, existingEntry.Vault, validator, existingEntry.Address, diffAmount, false) if err != nil { details = append(details, utils.Attribute{Key: "neededStake", Value: amount.Sub(existingEntry.Stake).String()}) return utils.LavaFormatWarning("insufficient funds to pay for difference in stake", err, @@ -220,7 +220,7 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin ) } - delegations, err := k.dualstakingKeeper.GetProviderDelegators(ctx, provider, nextEpoch) + delegations, err := k.dualstakingKeeper.GetProviderDelegators(ctx, provider) if err != nil { utils.LavaFormatWarning("cannot get provider's delegators", err, utils.LogAttr("provider", provider), @@ -229,7 +229,7 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin } for _, d := range delegations { - if (d.Delegator == creator && d.Provider == provider) || d.ChainID != chainID { + if d.Delegator == creator && d.Provider == provider { // ignore provider self delegation (delegator = vault, provider = provider) or delegations from other chains continue } @@ -252,7 +252,7 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin k.epochStorageKeeper.SetStakeEntryCurrent(ctx, stakeEntry) - err = k.dualstakingKeeper.DelegateFull(ctx, stakeEntry.Vault, validator, stakeEntry.Address, chainID, amount) + err = k.dualstakingKeeper.DelegateFull(ctx, stakeEntry.Vault, validator, stakeEntry.Address, amount) if err != nil { return utils.LavaFormatWarning("provider self delegation failed", err, details..., diff --git a/x/pairing/keeper/unstaking.go b/x/pairing/keeper/unstaking.go index ff4f6eafb0..f209db31b6 100644 --- a/x/pairing/keeper/unstaking.go +++ b/x/pairing/keeper/unstaking.go @@ -46,7 +46,7 @@ func (k Keeper) UnstakeEntry(ctx sdk.Context, validator, chainID, creator, unsta } // the stake entry is removed inside UnbondFull - err := k.dualstakingKeeper.UnbondFull(ctx, existingEntry.Vault, validator, existingEntry.Address, existingEntry.GetChain(), existingEntry.Stake, true) + err := k.dualstakingKeeper.UnbondFull(ctx, existingEntry.Vault, validator, existingEntry.Address, existingEntry.Stake, true) if err != nil { return utils.LavaFormatWarning("can't unbond self delegation", err, utils.Attribute{Key: "address", Value: existingEntry.Address}, @@ -95,7 +95,7 @@ func (k Keeper) UnstakeEntryForce(ctx sdk.Context, chainID, provider, unstakeDes amount = totalAmount } totalAmount = totalAmount.Sub(amount) - err = k.dualstakingKeeper.UnbondFull(ctx, existingEntry.Vault, validator.OperatorAddress, existingEntry.Address, existingEntry.GetChain(), sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), amount), true) + err = k.dualstakingKeeper.UnbondFull(ctx, existingEntry.Vault, validator.OperatorAddress, existingEntry.Address, sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), amount), true) if err != nil { return utils.LavaFormatWarning("can't unbond self delegation", err, utils.LogAttr("provider", existingEntry.Address), diff --git a/x/pairing/module.go b/x/pairing/module.go index 5f605c9eb7..17cefe9fe3 100644 --- a/x/pairing/module.go +++ b/x/pairing/module.go @@ -133,10 +133,10 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { if err := cfg.RegisterMigration(types.ModuleName, 2, migrator.MigrateVersion2To3); err != nil { panic(fmt.Errorf("%s: failed to register migration to v3: %w", types.ModuleName, err)) } - // register v3 -> v4 migration - if err := cfg.RegisterMigration(types.ModuleName, 3, migrator.MigrateVersion3To4); err != nil { - panic(fmt.Errorf("%s: failed to register migration to v4: %w", types.ModuleName, err)) - } + // // register v3 -> v4 migration + // if err := cfg.RegisterMigration(types.ModuleName, 3, migrator.MigrateVersion3To4); err != nil { + // panic(fmt.Errorf("%s: failed to register migration to v4: %w", types.ModuleName, err)) + // } } // RegisterInvariants registers the capability module's invariants. diff --git a/x/pairing/types/expected_keepers.go b/x/pairing/types/expected_keepers.go index 6a8fb13978..dc64f8e35a 100644 --- a/x/pairing/types/expected_keepers.go +++ b/x/pairing/types/expected_keepers.go @@ -103,9 +103,9 @@ type DowntimeKeeper interface { type DualstakingKeeper interface { RewardProvidersAndDelegators(ctx sdk.Context, providerAddr string, chainID string, totalReward sdk.Coins, senderModule string, calcOnlyProvider bool, calcOnlyDelegators bool, calcOnlyContributor bool) (providerReward sdk.Coins, totalRewards sdk.Coins, err error) - DelegateFull(ctx sdk.Context, delegator string, validator string, provider string, chainID string, amount sdk.Coin) error - UnbondFull(ctx sdk.Context, delegator string, validator string, provider string, chainID string, amount sdk.Coin, unstake bool) error - GetProviderDelegators(ctx sdk.Context, provider string, epoch uint64) ([]dualstakingtypes.Delegation, error) + DelegateFull(ctx sdk.Context, delegator string, validator string, provider string, amount sdk.Coin) error + UnbondFull(ctx sdk.Context, delegator string, validator string, provider string, amount sdk.Coin, unstake bool) error + GetProviderDelegators(ctx sdk.Context, provider string) ([]dualstakingtypes.Delegation, error) MinSelfDelegation(ctx sdk.Context) sdk.Coin } diff --git a/x/subscription/keeper/grpc_query_estimated_rewards.go b/x/subscription/keeper/grpc_query_estimated_rewards.go index 6c180b44ef..b8b6771858 100644 --- a/x/subscription/keeper/grpc_query_estimated_rewards.go +++ b/x/subscription/keeper/grpc_query_estimated_rewards.go @@ -45,7 +45,7 @@ func (k Keeper) EstimatedRewards(goCtx context.Context, req *types.QueryEstimate if req.AmountDelegator != "" { _, err := sdk.AccAddressFromBech32(req.AmountDelegator) if err == nil { - d, found := k.dualstakingKeeper.GetDelegation(ctx, req.AmountDelegator, req.Provider, req.ChainId, uint64(ctx.BlockHeight())) + d, found := k.dualstakingKeeper.GetDelegation(ctx, req.AmountDelegator, req.Provider) if !found { return nil, fmt.Errorf("could not find delegator") } diff --git a/x/subscription/types/expected_keepers.go b/x/subscription/types/expected_keepers.go index 264fe6f6d1..441ae78ea2 100644 --- a/x/subscription/types/expected_keepers.go +++ b/x/subscription/types/expected_keepers.go @@ -69,7 +69,7 @@ type TimerStoreKeeper interface { type DualStakingKeeper interface { RewardProvidersAndDelegators(ctx sdk.Context, providerAddr string, chainID string, totalReward sdk.Coins, senderModule string, calcOnlyProvider bool, calcOnlyDelegators bool, calcOnlyContributor bool) (providerReward sdk.Coins, totalRewards sdk.Coins, err error) - GetDelegation(ctx sdk.Context, delegator, provider, chainID string, epoch uint64) (dualstakingtypes.Delegation, bool) + GetDelegation(ctx sdk.Context, delegator, provider string) (dualstakingtypes.Delegation, bool) } type RewardsKeeper interface { From 737e0e4c965114d432755f0dc065e29ce4205e35 Mon Sep 17 00:00:00 2001 From: Yaroms Date: Wed, 11 Sep 2024 18:26:16 +0300 Subject: [PATCH 03/27] fix the genesis --- proto/lavanet/lava/dualstaking/genesis.proto | 4 +- x/dualstaking/genesis.go | 16 +++- x/dualstaking/keeper/delegate.go | 15 ++- x/dualstaking/keeper/keeper.go | 2 +- x/dualstaking/types/genesis.go | 18 +++- x/dualstaking/types/genesis.pb.go | 96 ++++++++++++++++---- 6 files changed, 118 insertions(+), 33 deletions(-) diff --git a/proto/lavanet/lava/dualstaking/genesis.proto b/proto/lavanet/lava/dualstaking/genesis.proto index c06b04be49..1c37aac064 100644 --- a/proto/lavanet/lava/dualstaking/genesis.proto +++ b/proto/lavanet/lava/dualstaking/genesis.proto @@ -3,9 +3,8 @@ package lavanet.lava.dualstaking; import "gogoproto/gogo.proto"; import "lavanet/lava/dualstaking/params.proto"; -import "lavanet/lava/fixationstore/fixation.proto"; -import "lavanet/lava/timerstore/timer.proto"; import "lavanet/lava/dualstaking/delegator_reward.proto"; +import "lavanet/lava/dualstaking/delegate.proto"; option go_package = "github.com/lavanet/lava/v3/x/dualstaking/types"; @@ -14,4 +13,5 @@ message GenesisState { Params params = 1 [(gogoproto.nullable) = false]; reserved 2,3,4; repeated DelegatorReward delegator_reward_list = 5 [(gogoproto.nullable) = false]; + repeated Delegation Delegations = 6 [(gogoproto.nullable) = false]; } diff --git a/x/dualstaking/genesis.go b/x/dualstaking/genesis.go index 5b6fecf674..ae00d5de7c 100644 --- a/x/dualstaking/genesis.go +++ b/x/dualstaking/genesis.go @@ -11,8 +11,12 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) // this line is used by starport scaffolding # genesis/module/init k.SetParams(ctx, genState.Params) - k.InitDelegations(ctx, genState.DelegationsFS) - k.InitDelegators(ctx, genState.DelegatorsFS) + for _, d := range genState.Delegations { + err := k.SetDelegation(ctx, d) + if err != nil { + panic(err) + } + } // Set all the DelegatorReward for _, elem := range genState.DelegatorRewardList { @@ -25,8 +29,12 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { genesis := types.DefaultGenesis() genesis.Params = k.GetParams(ctx) - genesis.DelegationsFS = k.ExportDelegations(ctx) - genesis.DelegatorsFS = k.ExportDelegators(ctx) + var err error + genesis.Delegations, err = k.GetAllDelegations(ctx) + if err != nil { + panic(err) + } + genesis.DelegatorRewardList = k.GetAllDelegatorReward(ctx) // this line is used by starport scaffolding # genesis/module/export diff --git a/x/dualstaking/keeper/delegate.go b/x/dualstaking/keeper/delegate.go index a6b559da81..984936cea3 100644 --- a/x/dualstaking/keeper/delegate.go +++ b/x/dualstaking/keeper/delegate.go @@ -70,7 +70,7 @@ func (k Keeper) decreaseDelegation(ctx sdk.Context, delegator, provider string, delegation.SubAmount(amount) - err := k.SetDelegation(ctx, provider, delegator, delegation) + err := k.SetDelegation(ctx, delegation) if err != nil { return err } @@ -324,8 +324,17 @@ func (k Keeper) GetDelegation(ctx sdk.Context, provider, delegator string) (type return delegation, err == nil } -func (k Keeper) SetDelegation(ctx sdk.Context, provider, delegator string, delegation types.Delegation) error { - return k.delegations.Set(ctx, types.DelegationKey(provider, delegator), delegation) +func (k Keeper) GetAllDelegations(ctx sdk.Context) ([]types.Delegation, error) { + iter, err := k.delegations.Iterate(ctx, nil) + if err != nil { + return nil, err + } + + return iter.Values() +} + +func (k Keeper) SetDelegation(ctx sdk.Context, delegation types.Delegation) error { + return k.delegations.Set(ctx, types.DelegationKey(delegation.Provider, delegation.Delegator), delegation) } func (k Keeper) UnbondUniformProviders(ctx sdk.Context, delegator string, amount sdk.Coin) error { diff --git a/x/dualstaking/keeper/keeper.go b/x/dualstaking/keeper/keeper.go index 310a317a28..3e0597734c 100644 --- a/x/dualstaking/keeper/keeper.go +++ b/x/dualstaking/keeper/keeper.go @@ -74,7 +74,7 @@ func (k Keeper) ChangeDelegationTimestampForTesting(ctx sdk.Context, provider, d return fmt.Errorf("cannot change delegation timestamp: delegation not found. provider: %s, delegator: %s", provider, delegator) } d.Timestamp = timestamp - return k.SetDelegation(ctx, provider, delegator, d) + return k.SetDelegation(ctx, d) } func (k Keeper) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { diff --git a/x/dualstaking/types/genesis.go b/x/dualstaking/types/genesis.go index aefa38b541..d534bbaac3 100644 --- a/x/dualstaking/types/genesis.go +++ b/x/dualstaking/types/genesis.go @@ -3,7 +3,7 @@ package types import ( fmt "fmt" - fixationstoretypes "github.com/lavanet/lava/v3/x/fixationstore/types" + "cosmossdk.io/collections" ) // DefaultIndex is the default global index @@ -15,8 +15,7 @@ func DefaultGenesis() *GenesisState { // this line is used by starport scaffolding # genesis/types/default Params: DefaultParams(), DelegatorRewardList: []DelegatorReward{}, - DelegationsFS: *fixationstoretypes.DefaultGenesis(), - DelegatorsFS: *fixationstoretypes.DefaultGenesis(), + Delegations: []Delegation{}, } } @@ -24,15 +23,24 @@ func DefaultGenesis() *GenesisState { // failure. func (gs GenesisState) Validate() error { // Check for duplicated index in delegatorReward - delegatorRewardIndexMap := make(map[string]struct{}) + delegatorRewardIndexMap := make(map[collections.Pair[string, string]]struct{}) for _, elem := range gs.DelegatorRewardList { - index := DelegationKey(elem.Provider, elem.Delegator, elem.ChainId) + index := DelegationKey(elem.Provider, elem.Delegator) if _, ok := delegatorRewardIndexMap[index]; ok { return fmt.Errorf("duplicated index for delegatorReward") } delegatorRewardIndexMap[index] = struct{}{} } + + delegationIndexMap := make(map[collections.Pair[string, string]]struct{}) + for _, elem := range gs.Delegations { + index := DelegationKey(elem.Provider, elem.Delegator) + if _, ok := delegationIndexMap[index]; ok { + return fmt.Errorf("duplicated index for delegations") + } + delegationIndexMap[index] = struct{}{} + } // this line is used by starport scaffolding # genesis/types/validate return gs.Params.Validate() diff --git a/x/dualstaking/types/genesis.pb.go b/x/dualstaking/types/genesis.pb.go index b77bfde476..672d9c0e41 100644 --- a/x/dualstaking/types/genesis.pb.go +++ b/x/dualstaking/types/genesis.pb.go @@ -7,8 +7,6 @@ import ( fmt "fmt" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" - _ "github.com/lavanet/lava/v3/x/fixationstore/types" - _ "github.com/lavanet/lava/v3/x/timerstore/types" io "io" math "math" math_bits "math/bits" @@ -29,6 +27,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type GenesisState struct { Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` DelegatorRewardList []DelegatorReward `protobuf:"bytes,5,rep,name=delegator_reward_list,json=delegatorRewardList,proto3" json:"delegator_reward_list"` + Delegations []Delegation `protobuf:"bytes,6,rep,name=Delegations,proto3" json:"Delegations"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -78,6 +77,13 @@ func (m *GenesisState) GetDelegatorRewardList() []DelegatorReward { return nil } +func (m *GenesisState) GetDelegations() []Delegation { + if m != nil { + return m.Delegations + } + return nil +} + func init() { proto.RegisterType((*GenesisState)(nil), "lavanet.lava.dualstaking.GenesisState") } @@ -87,27 +93,27 @@ func init() { } var fileDescriptor_d5bca863c53f218f = []byte{ - // 311 bytes of a gzipped FileDescriptorProto + // 308 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0xcb, 0x49, 0x2c, 0x4b, 0xcc, 0x4b, 0x2d, 0xd1, 0x07, 0xd1, 0xfa, 0x29, 0xa5, 0x89, 0x39, 0xc5, 0x25, 0x89, 0xd9, 0x99, 0x79, 0xe9, 0xfa, 0xe9, 0xa9, 0x79, 0xa9, 0xc5, 0x99, 0xc5, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x12, 0x50, 0x75, 0x7a, 0x20, 0x5a, 0x0f, 0x49, 0x9d, 0x94, 0x48, 0x7a, 0x7e, 0x7a, 0x3e, 0x58, 0x91, 0x3e, 0x88, 0x05, 0x51, 0x2f, 0xa5, 0x8a, 0xd3, 0xdc, 0x82, 0xc4, 0xa2, 0xc4, 0x5c, - 0xa8, 0xb1, 0x52, 0x9a, 0x28, 0xca, 0xd2, 0x32, 0x2b, 0x12, 0x4b, 0x32, 0xf3, 0xf3, 0x8a, 0x4b, - 0xf2, 0x8b, 0x52, 0xe1, 0x3c, 0xa8, 0x52, 0x65, 0x14, 0xa5, 0x25, 0x99, 0xb9, 0xa9, 0x45, 0x10, - 0x75, 0x60, 0x26, 0x54, 0x91, 0x3e, 0x4e, 0x6b, 0x53, 0x52, 0x73, 0x52, 0xd3, 0x13, 0x4b, 0xf2, - 0x8b, 0xe2, 0x8b, 0x52, 0xcb, 0x13, 0x8b, 0x52, 0x20, 0x1a, 0x94, 0x8e, 0x32, 0x72, 0xf1, 0xb8, - 0x43, 0x7c, 0x1a, 0x5c, 0x92, 0x58, 0x92, 0x2a, 0x64, 0xc7, 0xc5, 0x06, 0x71, 0xa1, 0x04, 0xa3, - 0x02, 0xa3, 0x06, 0xb7, 0x91, 0x82, 0x1e, 0x2e, 0x9f, 0xeb, 0x05, 0x80, 0xd5, 0x39, 0xb1, 0x9c, - 0xb8, 0x27, 0xcf, 0x10, 0x04, 0xd5, 0x25, 0x94, 0xcc, 0x25, 0x8a, 0x6e, 0x55, 0x7c, 0x4e, 0x66, - 0x71, 0x89, 0x04, 0xab, 0x02, 0xb3, 0x06, 0xb7, 0x91, 0x26, 0x6e, 0xe3, 0x5c, 0x60, 0xda, 0x82, - 0xc0, 0xba, 0xa0, 0xe6, 0x0a, 0xa7, 0xa0, 0x0a, 0xfb, 0x64, 0x16, 0x97, 0x78, 0xb1, 0x70, 0x30, - 0x09, 0x30, 0x7b, 0xb1, 0x70, 0x30, 0x0b, 0xb0, 0x78, 0xb1, 0x70, 0xb0, 0x08, 0xb0, 0x3a, 0x79, - 0x9c, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, - 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x5e, 0x7a, 0x66, 0x49, 0x46, - 0x69, 0x92, 0x5e, 0x72, 0x7e, 0x2e, 0x6a, 0xe8, 0x94, 0x19, 0xeb, 0x57, 0xa0, 0x04, 0x51, 0x49, - 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0x38, 0x60, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, - 0x16, 0xb0, 0x0d, 0x1a, 0x02, 0x00, 0x00, + 0xa8, 0xb1, 0x52, 0xfa, 0x38, 0x95, 0xa5, 0xa4, 0xe6, 0xa4, 0xa6, 0x27, 0x96, 0xe4, 0x17, 0xc5, + 0x17, 0xa5, 0x96, 0x27, 0x16, 0xa5, 0x40, 0x35, 0xa8, 0x13, 0xd2, 0x90, 0x0a, 0x51, 0xa8, 0x34, + 0x99, 0x89, 0x8b, 0xc7, 0x1d, 0xe2, 0x85, 0xe0, 0x92, 0xc4, 0x92, 0x54, 0x21, 0x3b, 0x2e, 0x36, + 0x88, 0xd5, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xdc, 0x46, 0x0a, 0x7a, 0xb8, 0xbc, 0xa4, 0x17, 0x00, + 0x56, 0xe7, 0xc4, 0x72, 0xe2, 0x9e, 0x3c, 0x43, 0x10, 0x54, 0x97, 0x50, 0x32, 0x97, 0x28, 0xba, + 0x9b, 0xe2, 0x73, 0x32, 0x8b, 0x4b, 0x24, 0x58, 0x15, 0x98, 0x35, 0xb8, 0x8d, 0x34, 0x71, 0x1b, + 0xe7, 0x02, 0xd3, 0x16, 0x04, 0xd6, 0x05, 0x35, 0x57, 0x38, 0x05, 0x55, 0xd8, 0x27, 0xb3, 0xb8, + 0x44, 0xc8, 0x87, 0x8b, 0x1b, 0xaa, 0x3a, 0x33, 0x3f, 0xaf, 0x58, 0x82, 0x0d, 0x6c, 0xb4, 0x0a, + 0x41, 0xa3, 0x33, 0xf3, 0xf3, 0xa0, 0xa6, 0x22, 0x6b, 0xf7, 0x62, 0xe1, 0x60, 0x12, 0x60, 0xf6, + 0x62, 0xe1, 0x60, 0x16, 0x60, 0xf1, 0x62, 0xe1, 0x60, 0x11, 0x60, 0x75, 0xf2, 0x38, 0xf1, 0x48, + 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, + 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0xbd, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, + 0xe4, 0xfc, 0x5c, 0xd4, 0x48, 0x29, 0x33, 0xd6, 0xaf, 0x40, 0x09, 0xe8, 0x92, 0xca, 0x82, 0xd4, + 0xe2, 0x24, 0x36, 0x70, 0x30, 0x1b, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x19, 0x97, 0xa1, 0xc1, + 0x41, 0x02, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -130,6 +136,20 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Delegations) > 0 { + for iNdEx := len(m.Delegations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Delegations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } if len(m.DelegatorRewardList) > 0 { for iNdEx := len(m.DelegatorRewardList) - 1; iNdEx >= 0; iNdEx-- { { @@ -182,6 +202,12 @@ func (m *GenesisState) Size() (n int) { n += 1 + l + sovGenesis(uint64(l)) } } + if len(m.Delegations) > 0 { + for _, e := range m.Delegations { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } return n } @@ -287,6 +313,40 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Delegations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Delegations = append(m.Delegations, Delegation{}) + if err := m.Delegations[len(m.Delegations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:]) From 5db81432cf9106c0046e181c3210e3fdb03d24f5 Mon Sep 17 00:00:00 2001 From: Yaroms Date: Wed, 11 Sep 2024 21:52:26 +0300 Subject: [PATCH 04/27] add metadata and aftermodify --- .../lava/epochstorage/provider_metadata.proto | 14 + x/dualstaking/keeper/delegate.go | 126 ++--- x/dualstaking/types/expected_keepers.go | 2 + x/epochstorage/keeper/keeper.go | 1 + x/epochstorage/keeper/provider_metadata.go | 31 ++ x/epochstorage/types/provider_metadata.pb.go | 489 ++++++++++++++++++ 6 files changed, 604 insertions(+), 59 deletions(-) create mode 100644 proto/lavanet/lava/epochstorage/provider_metadata.proto create mode 100644 x/epochstorage/keeper/provider_metadata.go create mode 100644 x/epochstorage/types/provider_metadata.pb.go diff --git a/proto/lavanet/lava/epochstorage/provider_metadata.proto b/proto/lavanet/lava/epochstorage/provider_metadata.proto new file mode 100644 index 0000000000..a30d35eb63 --- /dev/null +++ b/proto/lavanet/lava/epochstorage/provider_metadata.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; +package lavanet.lava.epochstorage; + +option go_package = "github.com/lavanet/lava/v3/x/epochstorage/types"; +import "gogoproto/gogo.proto"; +import "cosmos/base/v1beta1/coin.proto"; +import "amino/amino.proto"; + +message ProviderMetadata { + string provider = 1; + cosmos.base.v1beta1.Coin SelfDelegation = 2 [(gogoproto.nullable) = false]; + cosmos.base.v1beta1.Coin TotalDelegations = 3 [(gogoproto.nullable) = false]; + repeated string chains = 4; +} \ No newline at end of file diff --git a/x/dualstaking/keeper/delegate.go b/x/dualstaking/keeper/delegate.go index 984936cea3..8304248ac6 100644 --- a/x/dualstaking/keeper/delegate.go +++ b/x/dualstaking/keeper/delegate.go @@ -25,6 +25,7 @@ import ( commontypes "github.com/lavanet/lava/v3/utils/common/types" lavaslices "github.com/lavanet/lava/v3/utils/lavaslices" "github.com/lavanet/lava/v3/x/dualstaking/types" + epochstoragetypes "github.com/lavanet/lava/v3/x/epochstorage/types" "golang.org/x/exp/slices" ) @@ -48,7 +49,7 @@ func (k Keeper) increaseDelegation(ctx sdk.Context, delegator, provider string, if provider != commontypes.EMPTY_PROVIDER { // update the stake entry - return k.modifyStakeEntryDelegation(ctx, delegator, provider, amount, true) + return k.AfterDelegationModified(ctx, delegator, provider, amount, true) } return nil @@ -76,69 +77,76 @@ func (k Keeper) decreaseDelegation(ctx sdk.Context, delegator, provider string, } if provider != commontypes.EMPTY_PROVIDER { - return k.modifyStakeEntryDelegation(ctx, delegator, provider, amount, false) + return k.AfterDelegationModified(ctx, delegator, provider, amount, false) } return nil } -// modifyStakeEntryDelegation modifies the (epochstorage) stake-entry of the provider for a chain based on the action (increase or decrease). -func (k Keeper) modifyStakeEntryDelegation(ctx sdk.Context, delegator, provider string, amount sdk.Coin, increase bool) (err error) { - // todo yarom - - // stakeEntry, exists := k.epochstorageKeeper.GetStakeEntryCurrent(ctx, chainID, provider) - // if !exists || provider != stakeEntry.Address { - // if increase { - // return epochstoragetypes.ErrProviderNotStaked - // } - // // For decrease, if the provider doesn't exist, return without error - // return nil - // } - - // if delegator == stakeEntry.Vault { - // if increase { - // stakeEntry.Stake = stakeEntry.Stake.Add(amount) - // } else { - // stakeEntry.Stake, err = stakeEntry.Stake.SafeSub(amount) - // if err != nil { - // return fmt.Errorf("invalid or insufficient funds: %w", err) - // } - // } - // } else { - // if increase { - // stakeEntry.DelegateTotal = stakeEntry.DelegateTotal.Add(amount) - // } else { - // stakeEntry.DelegateTotal, err = stakeEntry.DelegateTotal.SafeSub(amount) - // if err != nil { - // return fmt.Errorf("invalid or insufficient funds: %w", err) - // } - // } - // } - - // details := map[string]string{ - // "provider_vault": stakeEntry.Vault, - // "provider_provider": stakeEntry.Address, - // "chain_id": stakeEntry.Chain, - // "moniker": stakeEntry.Description.Moniker, - // "description": stakeEntry.Description.String(), - // "stake": stakeEntry.Stake.String(), - // "effective_stake": stakeEntry.TotalStake().String() + stakeEntry.Stake.Denom, - // } - - // if stakeEntry.Stake.IsLT(k.GetParams(ctx).MinSelfDelegation) { - // k.epochstorageKeeper.RemoveStakeEntryCurrent(ctx, chainID, stakeEntry.Address) - // details["min_self_delegation"] = k.GetParams(ctx).MinSelfDelegation.String() - // utils.LogLavaEvent(ctx, k.Logger(ctx), types.UnstakeFromUnbond, details, "unstaking provider due to unbond that lowered its stake below min self delegation") - // return nil - // } else if stakeEntry.TotalStake().LT(k.specKeeper.GetMinStake(ctx, chainID).Amount) { - // details["min_spec_stake"] = k.specKeeper.GetMinStake(ctx, chainID).String() - // utils.LogLavaEvent(ctx, k.Logger(ctx), types.FreezeFromUnbond, details, "freezing provider due to stake below min spec stake") - // stakeEntry.Freeze() - // } else if delegator == stakeEntry.Vault && stakeEntry.IsFrozen() && !stakeEntry.IsJailed(ctx.BlockTime().UTC().Unix()) { - // stakeEntry.UnFreeze(k.epochstorageKeeper.GetCurrentNextEpoch(ctx) + 1) - // } - - // k.epochstorageKeeper.SetStakeEntryCurrent(ctx, stakeEntry) +func (k Keeper) AfterDelegationModified(ctx sdk.Context, delegator, provider string, amount sdk.Coin, increase bool) (err error) { + + // get all entries + metadata, err := k.epochstorageKeeper.GetMetadata(ctx, provider) + if err != nil { + return err + } + + // check if self delegation + selfdelegation := delegator == provider + + entries := []epochstoragetypes.StakeEntry{} + for _, chain := range metadata.Chains { + entry, found := k.epochstorageKeeper.GetStakeEntryCurrent(ctx, chain, provider) + if !found { + panic("AfterDelegationModified: entry not found ") + } + entries = append(entries, entry) + if !selfdelegation && entry.Vault == delegator { + selfdelegation = true + } + } + + if increase { + if selfdelegation { + metadata.SelfDelegation = metadata.SelfDelegation.Add(amount) + } else { + metadata.TotalDelegations = metadata.TotalDelegations.Add(amount) + } + } else { + if selfdelegation { + metadata.SelfDelegation, err = metadata.SelfDelegation.SafeSub(amount) + } else { + metadata.TotalDelegations, err = metadata.TotalDelegations.SafeSub(amount) + } + } + if err != nil { + return err + } + k.epochstorageKeeper.SetMetadata(ctx, metadata) + + details := map[string]string{ + "provider": provider, + } + + for _, entry := range entries { + entry.DelegateTotal = sdk.NewCoin(amount.Denom, metadata.TotalDelegations.Amount.Mul(entry.Stake.Amount).Quo(metadata.SelfDelegation.Amount)) + details[entry.Chain] = entry.Chain + if entry.Stake.IsLT(k.GetParams(ctx).MinSelfDelegation) { + k.epochstorageKeeper.RemoveStakeEntryCurrent(ctx, entry.Chain, entry.Address) + details["min_self_delegation"] = k.GetParams(ctx).MinSelfDelegation.String() + utils.LogLavaEvent(ctx, k.Logger(ctx), types.UnstakeFromUnbond, details, "unstaking provider due to unbond that lowered its stake below min self delegation") + return nil + } else if entry.TotalStake().LT(k.specKeeper.GetMinStake(ctx, entry.Chain).Amount) { + details["min_spec_stake"] = k.specKeeper.GetMinStake(ctx, entry.Chain).String() + utils.LogLavaEvent(ctx, k.Logger(ctx), types.FreezeFromUnbond, details, "freezing provider due to stake below min spec stake") + entry.Freeze() + k.epochstorageKeeper.SetStakeEntryCurrent(ctx, entry) + } else if delegator == entry.Vault && entry.IsFrozen() && !entry.IsJailed(ctx.BlockTime().UTC().Unix()) { + entry.UnFreeze(k.epochstorageKeeper.GetCurrentNextEpoch(ctx) + 1) + k.epochstorageKeeper.SetStakeEntryCurrent(ctx, entry) + } + + } return nil } diff --git a/x/dualstaking/types/expected_keepers.go b/x/dualstaking/types/expected_keepers.go index cd454a6c2f..e6e3851470 100644 --- a/x/dualstaking/types/expected_keepers.go +++ b/x/dualstaking/types/expected_keepers.go @@ -38,6 +38,8 @@ type EpochstorageKeeper interface { GetCurrentNextEpoch(ctx sdk.Context) (nextEpoch uint64) RemoveStakeEntryCurrent(ctx sdk.Context, chainID string, address string) GetStakeEntry(ctx sdk.Context, epoch uint64, chainID string, provider string) (val epochstoragetypes.StakeEntry, found bool) + GetMetadata(ctx sdk.Context, provider string) (epochstoragetypes.ProviderMetadata, error) + SetMetadata(ctx sdk.Context, metadata epochstoragetypes.ProviderMetadata) // Methods imported from epochstorage should be defined here } diff --git a/x/epochstorage/keeper/keeper.go b/x/epochstorage/keeper/keeper.go index 999f0932e5..ec545a9a7a 100644 --- a/x/epochstorage/keeper/keeper.go +++ b/x/epochstorage/keeper/keeper.go @@ -34,6 +34,7 @@ type ( stakeEntries *collections.IndexedMap[collections.Triple[uint64, string, collections.Pair[uint64, string]], types.StakeEntry, types.EpochChainIdProviderIndexes] stakeEntriesCurrent *collections.IndexedMap[collections.Pair[string, string], types.StakeEntry, types.ChainIdVaultIndexes] epochHashes collections.Map[uint64, []byte] + providersMetaData *collections.Map[string, types.ProviderMetadata] } ) diff --git a/x/epochstorage/keeper/provider_metadata.go b/x/epochstorage/keeper/provider_metadata.go new file mode 100644 index 0000000000..97c03891a6 --- /dev/null +++ b/x/epochstorage/keeper/provider_metadata.go @@ -0,0 +1,31 @@ +package keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/lavanet/lava/v3/x/epochstorage/types" +) + +func (k Keeper) GetMetadata(ctx sdk.Context, provider string) (types.ProviderMetadata, error) { + return k.providersMetaData.Get(ctx, provider) +} + +func (k Keeper) SetMetadata(ctx sdk.Context, metadata types.ProviderMetadata) { + err := k.providersMetaData.Set(ctx, metadata.Provider, metadata) + if err != nil { + panic(err) + } +} + +func (k Keeper) SetAllMetadata(ctx sdk.Context, metadata []types.ProviderMetadata) { + for _, md := range metadata { + k.SetMetadata(ctx, md) + } +} + +func (k Keeper) GetAllMetadata(ctx sdk.Context) ([]types.ProviderMetadata, error) { + iter, err := k.providersMetaData.Iterate(ctx, nil) + if err != nil { + panic(err) + } + return iter.Values() +} diff --git a/x/epochstorage/types/provider_metadata.pb.go b/x/epochstorage/types/provider_metadata.pb.go new file mode 100644 index 0000000000..a03b3043db --- /dev/null +++ b/x/epochstorage/types/provider_metadata.pb.go @@ -0,0 +1,489 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: lavanet/lava/epochstorage/provider_metadata.proto + +package types + +import ( + fmt "fmt" + types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/cosmos/cosmos-sdk/types/tx/amino" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type ProviderMetadata struct { + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` + SelfDelegation types.Coin `protobuf:"bytes,2,opt,name=SelfDelegation,proto3" json:"SelfDelegation"` + TotalDelegations types.Coin `protobuf:"bytes,3,opt,name=TotalDelegations,proto3" json:"TotalDelegations"` + Chains []string `protobuf:"bytes,4,rep,name=chains,proto3" json:"chains,omitempty"` +} + +func (m *ProviderMetadata) Reset() { *m = ProviderMetadata{} } +func (m *ProviderMetadata) String() string { return proto.CompactTextString(m) } +func (*ProviderMetadata) ProtoMessage() {} +func (*ProviderMetadata) Descriptor() ([]byte, []int) { + return fileDescriptor_eea88d8dbfad23fd, []int{0} +} +func (m *ProviderMetadata) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ProviderMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ProviderMetadata.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ProviderMetadata) XXX_Merge(src proto.Message) { + xxx_messageInfo_ProviderMetadata.Merge(m, src) +} +func (m *ProviderMetadata) XXX_Size() int { + return m.Size() +} +func (m *ProviderMetadata) XXX_DiscardUnknown() { + xxx_messageInfo_ProviderMetadata.DiscardUnknown(m) +} + +var xxx_messageInfo_ProviderMetadata proto.InternalMessageInfo + +func (m *ProviderMetadata) GetProvider() string { + if m != nil { + return m.Provider + } + return "" +} + +func (m *ProviderMetadata) GetSelfDelegation() types.Coin { + if m != nil { + return m.SelfDelegation + } + return types.Coin{} +} + +func (m *ProviderMetadata) GetTotalDelegations() types.Coin { + if m != nil { + return m.TotalDelegations + } + return types.Coin{} +} + +func (m *ProviderMetadata) GetChains() []string { + if m != nil { + return m.Chains + } + return nil +} + +func init() { + proto.RegisterType((*ProviderMetadata)(nil), "lavanet.lava.epochstorage.ProviderMetadata") +} + +func init() { + proto.RegisterFile("lavanet/lava/epochstorage/provider_metadata.proto", fileDescriptor_eea88d8dbfad23fd) +} + +var fileDescriptor_eea88d8dbfad23fd = []byte{ + // 302 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0x4f, 0x4b, 0xc3, 0x30, + 0x14, 0xc0, 0x1b, 0x37, 0x86, 0x8b, 0x20, 0xb3, 0x88, 0x74, 0x3b, 0xc4, 0xe1, 0x69, 0xa7, 0x84, + 0xb9, 0x6f, 0x30, 0x05, 0x11, 0x11, 0x64, 0x7a, 0xf2, 0x22, 0xaf, 0x5d, 0xec, 0x02, 0x6d, 0x5e, + 0x69, 0x62, 0xd1, 0x6f, 0xe1, 0xc7, 0xda, 0x71, 0x47, 0x0f, 0x22, 0xb2, 0x7e, 0x11, 0x69, 0x1b, + 0xff, 0x4c, 0x2f, 0x5e, 0xf2, 0xf2, 0x5e, 0xf2, 0xcb, 0x2f, 0xbc, 0x47, 0xc7, 0x09, 0x14, 0xa0, + 0xa5, 0x15, 0x55, 0x14, 0x32, 0xc3, 0x68, 0x61, 0x2c, 0xe6, 0x10, 0x4b, 0x91, 0xe5, 0x58, 0xa8, + 0xb9, 0xcc, 0xef, 0x52, 0x69, 0x61, 0x0e, 0x16, 0x78, 0x96, 0xa3, 0x45, 0xbf, 0xef, 0x10, 0x5e, + 0x45, 0xfe, 0x13, 0x19, 0xec, 0xc7, 0x18, 0x63, 0x7d, 0x4b, 0x54, 0xbb, 0x06, 0x18, 0xb0, 0x08, + 0x4d, 0x8a, 0x46, 0x84, 0x60, 0xa4, 0x28, 0xc6, 0xa1, 0xb4, 0x30, 0x16, 0x11, 0x2a, 0xed, 0xce, + 0xf7, 0x20, 0x55, 0x1a, 0x45, 0xbd, 0x36, 0xa5, 0xa3, 0x57, 0x42, 0x7b, 0x57, 0xce, 0x7f, 0xe9, + 0xf4, 0xfe, 0x80, 0x6e, 0x7f, 0xfe, 0x29, 0x20, 0x43, 0x32, 0xea, 0xce, 0xbe, 0x72, 0xff, 0x8c, + 0xee, 0x5e, 0xcb, 0xe4, 0xfe, 0x54, 0x26, 0x32, 0x06, 0xab, 0x50, 0x07, 0x5b, 0x43, 0x32, 0xda, + 0x39, 0xee, 0xf3, 0x46, 0xce, 0x2b, 0x39, 0x77, 0x72, 0x7e, 0x82, 0x4a, 0x4f, 0xdb, 0xcb, 0xb7, + 0x43, 0x6f, 0xf6, 0x0b, 0xf3, 0x2f, 0x68, 0xef, 0x06, 0x2d, 0x24, 0xdf, 0x25, 0x13, 0xb4, 0xfe, + 0xf7, 0xd4, 0x1f, 0xd0, 0x3f, 0xa0, 0x9d, 0x68, 0x01, 0x4a, 0x9b, 0xa0, 0x3d, 0x6c, 0x8d, 0xba, + 0x33, 0x97, 0x4d, 0xcf, 0x97, 0x6b, 0x46, 0x56, 0x6b, 0x46, 0xde, 0xd7, 0x8c, 0x3c, 0x97, 0xcc, + 0x5b, 0x95, 0xcc, 0x7b, 0x29, 0x99, 0x77, 0x2b, 0x62, 0x65, 0x17, 0x0f, 0x21, 0x8f, 0x30, 0x15, + 0x1b, 0xa3, 0x29, 0x26, 0xe2, 0x71, 0x73, 0x3e, 0xf6, 0x29, 0x93, 0x26, 0xec, 0xd4, 0x0d, 0x9b, + 0x7c, 0x04, 0x00, 0x00, 0xff, 0xff, 0x4c, 0x2e, 0xe7, 0x8c, 0xc9, 0x01, 0x00, 0x00, +} + +func (m *ProviderMetadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ProviderMetadata) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ProviderMetadata) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Chains) > 0 { + for iNdEx := len(m.Chains) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Chains[iNdEx]) + copy(dAtA[i:], m.Chains[iNdEx]) + i = encodeVarintProviderMetadata(dAtA, i, uint64(len(m.Chains[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + { + size, err := m.TotalDelegations.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProviderMetadata(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.SelfDelegation.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProviderMetadata(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Provider) > 0 { + i -= len(m.Provider) + copy(dAtA[i:], m.Provider) + i = encodeVarintProviderMetadata(dAtA, i, uint64(len(m.Provider))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintProviderMetadata(dAtA []byte, offset int, v uint64) int { + offset -= sovProviderMetadata(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *ProviderMetadata) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Provider) + if l > 0 { + n += 1 + l + sovProviderMetadata(uint64(l)) + } + l = m.SelfDelegation.Size() + n += 1 + l + sovProviderMetadata(uint64(l)) + l = m.TotalDelegations.Size() + n += 1 + l + sovProviderMetadata(uint64(l)) + if len(m.Chains) > 0 { + for _, s := range m.Chains { + l = len(s) + n += 1 + l + sovProviderMetadata(uint64(l)) + } + } + return n +} + +func sovProviderMetadata(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozProviderMetadata(x uint64) (n int) { + return sovProviderMetadata(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *ProviderMetadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProviderMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ProviderMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ProviderMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Provider", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProviderMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthProviderMetadata + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProviderMetadata + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Provider = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SelfDelegation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProviderMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProviderMetadata + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProviderMetadata + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SelfDelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalDelegations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProviderMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProviderMetadata + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProviderMetadata + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TotalDelegations.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Chains", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProviderMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthProviderMetadata + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProviderMetadata + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Chains = append(m.Chains, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProviderMetadata(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProviderMetadata + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipProviderMetadata(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowProviderMetadata + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowProviderMetadata + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowProviderMetadata + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthProviderMetadata + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupProviderMetadata + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthProviderMetadata + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthProviderMetadata = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowProviderMetadata = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupProviderMetadata = fmt.Errorf("proto: unexpected end of group") +) From 6e4bba8641b6c4a9518bc4404dbae0d0d9bdb014 Mon Sep 17 00:00:00 2001 From: Yaroms Date: Wed, 11 Sep 2024 22:02:49 +0300 Subject: [PATCH 05/27] done --- x/epochstorage/keeper/provider_metadata.go | 4 +++ x/epochstorage/keeper/stake_entries.go | 34 ++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/x/epochstorage/keeper/provider_metadata.go b/x/epochstorage/keeper/provider_metadata.go index 97c03891a6..9c3db359b3 100644 --- a/x/epochstorage/keeper/provider_metadata.go +++ b/x/epochstorage/keeper/provider_metadata.go @@ -16,6 +16,10 @@ func (k Keeper) SetMetadata(ctx sdk.Context, metadata types.ProviderMetadata) { } } +func (k Keeper) RemoveMetadata(ctx sdk.Context, provider string) error { + return k.providersMetaData.Remove(ctx, provider) +} + func (k Keeper) SetAllMetadata(ctx sdk.Context, metadata []types.ProviderMetadata) { for _, md := range metadata { k.SetMetadata(ctx, md) diff --git a/x/epochstorage/keeper/stake_entries.go b/x/epochstorage/keeper/stake_entries.go index de35d9d4d4..42644659db 100644 --- a/x/epochstorage/keeper/stake_entries.go +++ b/x/epochstorage/keeper/stake_entries.go @@ -2,12 +2,14 @@ package keeper import ( "fmt" + "slices" "sort" "strconv" "cosmossdk.io/collections" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/lavanet/lava/v3/utils" + "github.com/lavanet/lava/v3/utils/lavaslices" "github.com/lavanet/lava/v3/x/epochstorage/types" ) @@ -178,6 +180,21 @@ func (k Keeper) SetStakeEntryCurrent(ctx sdk.Context, stakeEntry types.StakeEntr if err != nil { panic(fmt.Errorf("SetStakeEntryCurrent: Failed to set entry for key %v, error: %w", key, err)) } + + metadata, err := k.GetMetadata(ctx, stakeEntry.Address) + if err != nil { + // init metadata + metadata = types.ProviderMetadata{ + Provider: stakeEntry.Address, + Chains: []string{}, + SelfDelegation: sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), sdk.ZeroInt()), + TotalDelegations: sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), sdk.ZeroInt()), + } + } + if !slices.Contains(metadata.Chains, stakeEntry.Chain) { + metadata.Chains = append(metadata.Chains, stakeEntry.Chain) + } + k.SetMetadata(ctx, metadata) } // RemoveStakeEntryCurrent deletes a current stake entry from the store @@ -187,6 +204,23 @@ func (k Keeper) RemoveStakeEntryCurrent(ctx sdk.Context, chainID string, provide if err != nil { panic(fmt.Errorf("RemoveStakeEntryCurrent: Failed to remove entry with key %v, error: %w", key, err)) } + + metadata, err := k.GetMetadata(ctx, provider) + if err != nil { + panic(fmt.Errorf("RemoveStakeEntryCurrent: Failed to fetch provider metadata %v, error: %w", provider, err)) + } + var ok bool + metadata.Chains, ok = lavaslices.Remove(metadata.Chains, chainID) + if !ok { + panic(fmt.Errorf("RemoveStakeEntryCurrent: Failed to remove chain from provider metadata %v, error: %w", provider, err)) + } + if len(metadata.Chains) == 0 { + if k.RemoveMetadata(ctx, provider) != nil { + panic(fmt.Errorf("RemoveStakeEntryCurrent: Failed to remove provider metadata %v, error: %w", provider, err)) + } + } else { + k.SetMetadata(ctx, metadata) + } } // GetAllStakeEntriesCurrent gets all the current stake entries From 0dc711a98d1790e36db370cb549a11778297237a Mon Sep 17 00:00:00 2001 From: Yaroms Date: Wed, 11 Sep 2024 22:47:26 +0300 Subject: [PATCH 06/27] works sanity --- x/dualstaking/keeper/delegate.go | 7 +++---- x/dualstaking/keeper/keeper.go | 21 ++++++++++++++++++++- x/dualstaking/keeper/msg_server_delegate.go | 4 ++-- x/dualstaking/types/keys.go | 12 +++--------- x/epochstorage/keeper/keeper.go | 4 +++- x/epochstorage/types/stake_entries.go | 1 + x/pairing/keeper/staking.go | 19 ++----------------- 7 files changed, 34 insertions(+), 34 deletions(-) diff --git a/x/dualstaking/keeper/delegate.go b/x/dualstaking/keeper/delegate.go index 8304248ac6..6ffe82b6b2 100644 --- a/x/dualstaking/keeper/delegate.go +++ b/x/dualstaking/keeper/delegate.go @@ -135,17 +135,16 @@ func (k Keeper) AfterDelegationModified(ctx sdk.Context, delegator, provider str k.epochstorageKeeper.RemoveStakeEntryCurrent(ctx, entry.Chain, entry.Address) details["min_self_delegation"] = k.GetParams(ctx).MinSelfDelegation.String() utils.LogLavaEvent(ctx, k.Logger(ctx), types.UnstakeFromUnbond, details, "unstaking provider due to unbond that lowered its stake below min self delegation") - return nil + continue } else if entry.TotalStake().LT(k.specKeeper.GetMinStake(ctx, entry.Chain).Amount) { details["min_spec_stake"] = k.specKeeper.GetMinStake(ctx, entry.Chain).String() utils.LogLavaEvent(ctx, k.Logger(ctx), types.FreezeFromUnbond, details, "freezing provider due to stake below min spec stake") entry.Freeze() - k.epochstorageKeeper.SetStakeEntryCurrent(ctx, entry) + } else if delegator == entry.Vault && entry.IsFrozen() && !entry.IsJailed(ctx.BlockTime().UTC().Unix()) { entry.UnFreeze(k.epochstorageKeeper.GetCurrentNextEpoch(ctx) + 1) - k.epochstorageKeeper.SetStakeEntryCurrent(ctx, entry) } - + k.epochstorageKeeper.SetStakeEntryCurrent(ctx, entry) } return nil diff --git a/x/dualstaking/keeper/keeper.go b/x/dualstaking/keeper/keeper.go index 3e0597734c..fb04e912ad 100644 --- a/x/dualstaking/keeper/keeper.go +++ b/x/dualstaking/keeper/keeper.go @@ -11,6 +11,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + collcompat "github.com/lavanet/lava/v3/utils/collcompat" "github.com/lavanet/lava/v3/x/dualstaking/types" ) @@ -27,8 +28,9 @@ type ( epochstorageKeeper types.EpochstorageKeeper specKeeper types.SpecKeeper + schema collections.Schema delegations *collections.IndexedMap[collections.Pair[string, string], types.Delegation, types.DelegationIndexes] - rewards *collections.Map[collections.Pair[string, string], types.DelegatorReward] + rewards collections.Map[collections.Pair[string, string], types.DelegatorReward] } ) @@ -49,6 +51,8 @@ func NewKeeper( ps = ps.WithKeyTable(types.ParamKeyTable()) } + sb := collections.NewSchemaBuilder(collcompat.NewKVStoreService(storeKey)) + keeper := &Keeper{ cdc: cdc, storeKey: storeKey, @@ -60,7 +64,22 @@ func NewKeeper( accountKeeper: accountKeeper, epochstorageKeeper: epochstorageKeeper, specKeeper: specKeeper, + + delegations: collections.NewIndexedMap(sb, types.DelegationsPrefix, "delegations", + collections.PairKeyCodec(collections.StringKey, collections.StringKey), + collcompat.ProtoValue[types.Delegation](cdc), + types.NewDelegationIndexes(sb)), + + rewards: collections.NewMap(sb, types.RewardPrefix, "rewards", + collections.PairKeyCodec(collections.StringKey, collections.StringKey), + collcompat.ProtoValue[types.DelegatorReward](cdc)), + } + + schema, err := sb.Build() + if err != nil { + panic(err) } + keeper.schema = schema return keeper } diff --git a/x/dualstaking/keeper/msg_server_delegate.go b/x/dualstaking/keeper/msg_server_delegate.go index 054a8a9909..d0445aad9b 100644 --- a/x/dualstaking/keeper/msg_server_delegate.go +++ b/x/dualstaking/keeper/msg_server_delegate.go @@ -40,7 +40,7 @@ func (k Keeper) DelegateFull(ctx sdk.Context, delegator string, validator string return err } - delegation, found := k.GetDelegation(ctx, delegator, commontypes.EMPTY_PROVIDER) + delegation, found := k.GetDelegation(ctx, commontypes.EMPTY_PROVIDER, delegator) amountBefore := sdk.ZeroInt() if found { amountBefore = delegation.Amount.Amount @@ -51,7 +51,7 @@ func (k Keeper) DelegateFull(ctx sdk.Context, delegator string, validator string return err } - delegation, _ = k.GetDelegation(ctx, delegator, commontypes.EMPTY_PROVIDER) + delegation, _ = k.GetDelegation(ctx, commontypes.EMPTY_PROVIDER, delegator) amount.Amount = delegation.Amount.Amount.Sub(amountBefore) diff --git a/x/dualstaking/types/keys.go b/x/dualstaking/types/keys.go index cfa0bc99b5..f3c2367c0f 100644 --- a/x/dualstaking/types/keys.go +++ b/x/dualstaking/types/keys.go @@ -17,15 +17,6 @@ const ( // MemStoreKey defines the in-memory store key MemStoreKey = "mem_dualstaking" - // prefix for the delegations fixation store - DelegationPrefix = "delegation-fs" - - // prefix for the delegators fixation store - DelegatorPrefix = "delegator-fs" - - // prefix for the unbonding timer store - UnbondingPrefix = "unbonding-ts" - // DisableDualstakingHooks prefix DisableDualstakingHookPrefix = "disable-dualstaking-hooks" @@ -40,3 +31,6 @@ func KeyPrefix(p string) []byte { func DelegationKey(provider, delegator string) collections.Pair[string, string] { return collections.Join(provider, delegator) } + +var DelegationsPrefix = collections.NewPrefix([]byte("Delegations/")) +var RewardPrefix = collections.NewPrefix([]byte("Rewards/")) diff --git a/x/epochstorage/keeper/keeper.go b/x/epochstorage/keeper/keeper.go index ec545a9a7a..a289969d11 100644 --- a/x/epochstorage/keeper/keeper.go +++ b/x/epochstorage/keeper/keeper.go @@ -34,7 +34,7 @@ type ( stakeEntries *collections.IndexedMap[collections.Triple[uint64, string, collections.Pair[uint64, string]], types.StakeEntry, types.EpochChainIdProviderIndexes] stakeEntriesCurrent *collections.IndexedMap[collections.Pair[string, string], types.StakeEntry, types.ChainIdVaultIndexes] epochHashes collections.Map[uint64, []byte] - providersMetaData *collections.Map[string, types.ProviderMetadata] + providersMetaData collections.Map[string, types.ProviderMetadata] } ) @@ -78,6 +78,8 @@ func NewKeeper( collcompat.ProtoValue[types.StakeEntry](cdc), types.NewChainIdVaultIndexes(sb)), epochHashes: collections.NewMap(sb, types.EpochHashesPrefix, "epoch_hashes", collections.Uint64Key, collections.BytesValue), + + providersMetaData: collections.NewMap(sb, types.ProviderMetaDataPrefix, "provider_metadata", collections.StringKey, collcompat.ProtoValue[types.ProviderMetadata](cdc)), } keeper.AddFixationRegistry(string(types.KeyEpochBlocks), func(ctx sdk.Context) any { return keeper.EpochBlocksRaw(ctx) }) diff --git a/x/epochstorage/types/stake_entries.go b/x/epochstorage/types/stake_entries.go index a1a8c5cd81..3fb2470bc7 100644 --- a/x/epochstorage/types/stake_entries.go +++ b/x/epochstorage/types/stake_entries.go @@ -17,6 +17,7 @@ var ( EpochChainIdProviderIndexesPrefix = collections.NewPrefix([]byte("EpochChainIdProviderIndexes/")) ChainIdVaultIndexesPrefix = collections.NewPrefix([]byte("ChainIdVaultIndexes/")) EpochHashesPrefix = collections.NewPrefix([]byte("EpochHash/")) + ProviderMetaDataPrefix = collections.NewPrefix([]byte("ProviderMetaData/")) ) // EpochChainIdProviderIndexes defines a secondary unique index for the keeper's stakeEntries indexed map diff --git a/x/pairing/keeper/staking.go b/x/pairing/keeper/staking.go index 05038e12ec..0e7bc580a8 100644 --- a/x/pairing/keeper/staking.go +++ b/x/pairing/keeper/staking.go @@ -153,6 +153,7 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin existingEntry.Description = description existingEntry.DelegateCommission = delegationCommission existingEntry.LastChange = uint64(ctx.BlockTime().UTC().Unix()) + existingEntry.Stake = amount k.epochStorageKeeper.SetStakeEntryCurrent(ctx, existingEntry) @@ -220,24 +221,8 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin ) } - delegations, err := k.dualstakingKeeper.GetProviderDelegators(ctx, provider) - if err != nil { - utils.LavaFormatWarning("cannot get provider's delegators", err, - utils.LogAttr("provider", provider), - utils.LogAttr("block", nextEpoch), - ) - } - - for _, d := range delegations { - if d.Delegator == creator && d.Provider == provider { - // ignore provider self delegation (delegator = vault, provider = provider) or delegations from other chains - continue - } - delegateTotal = delegateTotal.Add(d.Amount.Amount) - } - stakeEntry := epochstoragetypes.StakeEntry{ - Stake: sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), sdk.ZeroInt()), // we set this to 0 since the delegate will take care of this + Stake: amount, Address: provider, StakeAppliedBlock: stakeAppliedBlock, Endpoints: endpointsVerified, From 373d527063c853086f7be2a7ec2b54abaeccfd56 Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Thu, 12 Sep 2024 14:04:33 +0300 Subject: [PATCH 07/27] some fixes --- x/dualstaking/keeper/delegate.go | 13 ++++++++++--- x/dualstaking/keeper/delegate_test.go | 25 +------------------------ x/pairing/keeper/unstaking.go | 6 +++++- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/x/dualstaking/keeper/delegate.go b/x/dualstaking/keeper/delegate.go index 6ffe82b6b2..8a46f2836c 100644 --- a/x/dualstaking/keeper/delegate.go +++ b/x/dualstaking/keeper/delegate.go @@ -88,7 +88,12 @@ func (k Keeper) AfterDelegationModified(ctx sdk.Context, delegator, provider str // get all entries metadata, err := k.epochstorageKeeper.GetMetadata(ctx, provider) if err != nil { - return err + if increase { + return err + } else { + // we want to allow decreasing if the provider does not exist + return nil + } } // check if self delegation @@ -129,14 +134,16 @@ func (k Keeper) AfterDelegationModified(ctx sdk.Context, delegator, provider str } for _, entry := range entries { - entry.DelegateTotal = sdk.NewCoin(amount.Denom, metadata.TotalDelegations.Amount.Mul(entry.Stake.Amount).Quo(metadata.SelfDelegation.Amount)) + details[entry.Chain] = entry.Chain if entry.Stake.IsLT(k.GetParams(ctx).MinSelfDelegation) { k.epochstorageKeeper.RemoveStakeEntryCurrent(ctx, entry.Chain, entry.Address) details["min_self_delegation"] = k.GetParams(ctx).MinSelfDelegation.String() utils.LogLavaEvent(ctx, k.Logger(ctx), types.UnstakeFromUnbond, details, "unstaking provider due to unbond that lowered its stake below min self delegation") continue - } else if entry.TotalStake().LT(k.specKeeper.GetMinStake(ctx, entry.Chain).Amount) { + } + entry.DelegateTotal = sdk.NewCoin(amount.Denom, metadata.TotalDelegations.Amount.Mul(entry.Stake.Amount).Quo(metadata.SelfDelegation.Amount)) + if entry.TotalStake().LT(k.specKeeper.GetMinStake(ctx, entry.Chain).Amount) { details["min_spec_stake"] = k.specKeeper.GetMinStake(ctx, entry.Chain).String() utils.LogLavaEvent(ctx, k.Logger(ctx), types.FreezeFromUnbond, details, "freezing provider due to stake below min spec stake") entry.Freeze() diff --git a/x/dualstaking/keeper/delegate_test.go b/x/dualstaking/keeper/delegate_test.go index 4c160bfd3c..ca1ba4470f 100644 --- a/x/dualstaking/keeper/delegate_test.go +++ b/x/dualstaking/keeper/delegate_test.go @@ -44,13 +44,6 @@ func TestDelegateFail(t *testing.T) { chainID: "mockspec", amount: 1, }, - { - name: "bad chainID", - delegator: client1Addr, - provider: provider1Addr, - chainID: "invalid", - amount: 1, - }, { name: "bad amount", delegator: client1Addr, @@ -178,14 +171,6 @@ func TestRedelegateFail(t *testing.T) { chainID: "mockspec", amount: 1, }, - { - name: "bad chainID", - delegator: client1Addr, - provider1: provider1Addr, - provider2: provider2Addr, - chainID: "invalid", - amount: 1, - }, { name: "bad amount", delegator: client1Addr, @@ -283,8 +268,7 @@ func TestRedelegate(t *testing.T) { // redelegate from unstaking provider amount = sdk.NewCoin(commontypes.TokenDenom, sdk.NewInt(5000)) - _, err = ts.TxDualstakingRedelegate( - client1Addr, provider1Addr, provider2Addr, amount) + _, err = ts.TxDualstakingRedelegate(client1Addr, provider1Addr, provider2Addr, amount) require.NoError(t, err) // advance epoch to digest the delegate ts.AdvanceEpoch() @@ -332,13 +316,6 @@ func TestUnbondFail(t *testing.T) { chainID: "mockspec", amount: 1, }, - { - name: "bad chainID", - delegator: client1Addr, - provider: provider1Addr, - chainID: "invalid", - amount: 1, - }, { name: "bad amount", delegator: client1Addr, diff --git a/x/pairing/keeper/unstaking.go b/x/pairing/keeper/unstaking.go index f209db31b6..980e2385fe 100644 --- a/x/pairing/keeper/unstaking.go +++ b/x/pairing/keeper/unstaking.go @@ -45,8 +45,12 @@ func (k Keeper) UnstakeEntry(ctx sdk.Context, validator, chainID, creator, unsta ) } + amount := existingEntry.Stake + existingEntry.Stake.Amount = sdk.ZeroInt() + k.epochStorageKeeper.SetStakeEntryCurrent(ctx, existingEntry) + // the stake entry is removed inside UnbondFull - err := k.dualstakingKeeper.UnbondFull(ctx, existingEntry.Vault, validator, existingEntry.Address, existingEntry.Stake, true) + err := k.dualstakingKeeper.UnbondFull(ctx, existingEntry.Vault, validator, existingEntry.Address, amount, true) if err != nil { return utils.LavaFormatWarning("can't unbond self delegation", err, utils.Attribute{Key: "address", Value: existingEntry.Address}, From d97f2736f76129076d39653cddc40b8a98811e3f Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Thu, 12 Sep 2024 14:47:11 +0300 Subject: [PATCH 08/27] remove delegation when zero --- x/dualstaking/keeper/delegate.go | 19 ++++++++++++++----- x/dualstaking/keeper/delegate_test.go | 20 +++++++++----------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/x/dualstaking/keeper/delegate.go b/x/dualstaking/keeper/delegate.go index 8a46f2836c..86beff5a00 100644 --- a/x/dualstaking/keeper/delegate.go +++ b/x/dualstaking/keeper/delegate.go @@ -71,9 +71,16 @@ func (k Keeper) decreaseDelegation(ctx sdk.Context, delegator, provider string, delegation.SubAmount(amount) - err := k.SetDelegation(ctx, delegation) - if err != nil { - return err + if delegation.Amount.IsZero() { + err := k.RemoveDelegation(ctx, delegation) + if err != nil { + return err + } + } else { + err := k.SetDelegation(ctx, delegation) + if err != nil { + return err + } } if provider != commontypes.EMPTY_PROVIDER { @@ -84,7 +91,6 @@ func (k Keeper) decreaseDelegation(ctx sdk.Context, delegator, provider string, } func (k Keeper) AfterDelegationModified(ctx sdk.Context, delegator, provider string, amount sdk.Coin, increase bool) (err error) { - // get all entries metadata, err := k.epochstorageKeeper.GetMetadata(ctx, provider) if err != nil { @@ -134,7 +140,6 @@ func (k Keeper) AfterDelegationModified(ctx sdk.Context, delegator, provider str } for _, entry := range entries { - details[entry.Chain] = entry.Chain if entry.Stake.IsLT(k.GetParams(ctx).MinSelfDelegation) { k.epochstorageKeeper.RemoveStakeEntryCurrent(ctx, entry.Chain, entry.Address) @@ -351,6 +356,10 @@ func (k Keeper) SetDelegation(ctx sdk.Context, delegation types.Delegation) erro return k.delegations.Set(ctx, types.DelegationKey(delegation.Provider, delegation.Delegator), delegation) } +func (k Keeper) RemoveDelegation(ctx sdk.Context, delegation types.Delegation) error { + return k.delegations.Remove(ctx, types.DelegationKey(delegation.Provider, delegation.Delegator)) +} + func (k Keeper) UnbondUniformProviders(ctx sdk.Context, delegator string, amount sdk.Coin) error { providers, err := k.GetDelegatorProviders(ctx, delegator) if err != nil { diff --git a/x/dualstaking/keeper/delegate_test.go b/x/dualstaking/keeper/delegate_test.go index ca1ba4470f..27e0a8b136 100644 --- a/x/dualstaking/keeper/delegate_test.go +++ b/x/dualstaking/keeper/delegate_test.go @@ -378,13 +378,13 @@ func TestUnbond(t *testing.T) { // advance epoch to digest the delegate ts.AdvanceEpoch() // now in effect - delegated = delegated.Add(amount) + delegated = delegated.Add(amount).Add(amount) stakeEntry := ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) - require.True(t, delegated.IsEqual(stakeEntry.DelegateTotal)) + require.True(t, delegated.Amount.QuoRaw(2).Equal(stakeEntry.DelegateTotal.Amount)) res, err := ts.QueryDualstakingDelegatorProviders(client1Addr, true) require.NoError(t, err) - require.Len(t, res.Delegations, 2) + require.Len(t, res.Delegations, 1) // unbond once amount = sdk.NewCoin(commontypes.TokenDenom, sdk.NewInt(1000)) @@ -392,14 +392,13 @@ func TestUnbond(t *testing.T) { require.NoError(t, err) stakeEntry = ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) - require.True(t, delegated.IsEqual(stakeEntry.DelegateTotal)) - + require.True(t, delegated.Amount.QuoRaw(2).Equal(stakeEntry.DelegateTotal.Amount)) // advance epoch to digest the delegate ts.AdvanceEpoch() // now in effect delegated = delegated.Sub(amount) stakeEntry = ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) - require.True(t, delegated.IsEqual(stakeEntry.DelegateTotal)) + require.True(t, delegated.Amount.QuoRaw(2).Equal(stakeEntry.DelegateTotal.Amount)) // unbond twice in same block, and then in next block _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, amount) @@ -411,14 +410,14 @@ func TestUnbond(t *testing.T) { require.NoError(t, err) stakeEntry = ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) - require.True(t, delegated.IsEqual(stakeEntry.DelegateTotal)) + require.True(t, delegated.Amount.QuoRaw(2).Equal(stakeEntry.DelegateTotal.Amount)) // advance epoch to digest the delegate ts.AdvanceEpoch() // now in effect delegated = delegated.Sub(amount).Sub(amount) stakeEntry = ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) - require.True(t, delegated.IsEqual(stakeEntry.DelegateTotal)) + require.True(t, delegated.Amount.QuoRaw(2).Equal(stakeEntry.DelegateTotal.Amount)) _, err = ts.TxPairingUnstakeProvider(provider1Acct.GetVaultAddr(), ts.spec.Name) require.NoError(t, err) @@ -427,7 +426,7 @@ func TestUnbond(t *testing.T) { _, err = ts.TxDualstakingUnbond(client1Addr, provider1Addr, amount) require.NoError(t, err) stakeEntry = ts.getStakeEntry(provider1Acct.Addr.String(), ts.spec.Name) - require.True(t, delegated.IsEqual(stakeEntry.DelegateTotal)) + require.True(t, delegated.Amount.QuoRaw(2).Equal(stakeEntry.DelegateTotal.Amount)) delegated = delegated.Sub(amount) // unbond from unstaking provider everything @@ -448,8 +447,7 @@ func TestUnbond(t *testing.T) { res, err = ts.QueryDualstakingDelegatorProviders(client1Addr, true) require.NoError(t, err) - require.Len(t, res.Delegations, 1) - require.Equal(t, provider1Addr, res.Delegations[0].Provider) + require.Len(t, res.Delegations, 0) } func TestBondUnbondBond(t *testing.T) { From 9baca37fa7dfc839a81de04926107b4abdd84c9c Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Mon, 16 Sep 2024 14:30:24 +0300 Subject: [PATCH 09/27] added design issues --- .../lava/epochstorage/provider_metadata.proto | 2 +- x/dualstaking/keeper/balance.go | 2 +- x/dualstaking/keeper/delegate.go | 89 +++++++++++-------- x/dualstaking/keeper/msg_server_delegate.go | 5 +- x/dualstaking/keeper/msg_server_redelegate.go | 1 + x/dualstaking/keeper/msg_server_unbond.go | 3 +- x/dualstaking/types/keys.go | 6 +- x/epochstorage/keeper/stake_entries.go | 16 ---- x/epochstorage/types/provider_metadata.pb.go | 84 +++++++++-------- x/pairing/keeper/staking.go | 71 +++++++++++---- x/pairing/keeper/unstaking.go | 43 ++++++--- x/pairing/types/expected_keepers.go | 9 +- 12 files changed, 194 insertions(+), 137 deletions(-) diff --git a/proto/lavanet/lava/epochstorage/provider_metadata.proto b/proto/lavanet/lava/epochstorage/provider_metadata.proto index a30d35eb63..53ccd58a1f 100644 --- a/proto/lavanet/lava/epochstorage/provider_metadata.proto +++ b/proto/lavanet/lava/epochstorage/provider_metadata.proto @@ -8,7 +8,7 @@ import "amino/amino.proto"; message ProviderMetadata { string provider = 1; - cosmos.base.v1beta1.Coin SelfDelegation = 2 [(gogoproto.nullable) = false]; + string vault = 2; cosmos.base.v1beta1.Coin TotalDelegations = 3 [(gogoproto.nullable) = false]; repeated string chains = 4; } \ No newline at end of file diff --git a/x/dualstaking/keeper/balance.go b/x/dualstaking/keeper/balance.go index 3603279f3a..f443b2e461 100644 --- a/x/dualstaking/keeper/balance.go +++ b/x/dualstaking/keeper/balance.go @@ -18,7 +18,7 @@ func (k Keeper) BalanceDelegator(ctx sdk.Context, delegator sdk.AccAddress) (int } else if diff.IsPositive() { // less provider delegations,a delegation operation was done, delegate to empty provider err = k.delegate(ctx, delegator.String(), commontypes.EMPTY_PROVIDER, - sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), diff)) + sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), diff), false) if err != nil { return providers, err } diff --git a/x/dualstaking/keeper/delegate.go b/x/dualstaking/keeper/delegate.go index 86beff5a00..1884fee208 100644 --- a/x/dualstaking/keeper/delegate.go +++ b/x/dualstaking/keeper/delegate.go @@ -32,7 +32,7 @@ import ( // increaseDelegation increases the delegation of a delegator to a provider for a // given chain. It updates the fixation stores for both delegations and delegators, // and updates the (epochstorage) stake-entry. -func (k Keeper) increaseDelegation(ctx sdk.Context, delegator, provider string, amount sdk.Coin) error { +func (k Keeper) increaseDelegation(ctx sdk.Context, delegator, provider string, amount sdk.Coin, stake bool) error { // get, update the delegation entry delegation, err := k.delegations.Get(ctx, types.DelegationKey(provider, delegator)) if err != nil { @@ -49,7 +49,7 @@ func (k Keeper) increaseDelegation(ctx sdk.Context, delegator, provider string, if provider != commontypes.EMPTY_PROVIDER { // update the stake entry - return k.AfterDelegationModified(ctx, delegator, provider, amount, true) + return k.AfterDelegationModified(ctx, delegator, provider, amount, true, stake) } return nil @@ -58,7 +58,7 @@ func (k Keeper) increaseDelegation(ctx sdk.Context, delegator, provider string, // decreaseDelegation decreases the delegation of a delegator to a provider for a // given chain. It updates the fixation stores for both delegations and delegators, // and updates the (epochstorage) stake-entry. -func (k Keeper) decreaseDelegation(ctx sdk.Context, delegator, provider string, amount sdk.Coin) error { +func (k Keeper) decreaseDelegation(ctx sdk.Context, delegator, provider string, amount sdk.Coin, stake bool) error { // get, update and append the delegation entry delegation, found := k.GetDelegation(ctx, provider, delegator) if !found { @@ -84,13 +84,13 @@ func (k Keeper) decreaseDelegation(ctx sdk.Context, delegator, provider string, } if provider != commontypes.EMPTY_PROVIDER { - return k.AfterDelegationModified(ctx, delegator, provider, amount, false) + return k.AfterDelegationModified(ctx, delegator, provider, amount, false, stake) } return nil } -func (k Keeper) AfterDelegationModified(ctx sdk.Context, delegator, provider string, amount sdk.Coin, increase bool) (err error) { +func (k Keeper) AfterDelegationModified(ctx sdk.Context, delegator, provider string, amount sdk.Coin, increase, stake bool) (err error) { // get all entries metadata, err := k.epochstorageKeeper.GetMetadata(ctx, provider) if err != nil { @@ -102,34 +102,33 @@ func (k Keeper) AfterDelegationModified(ctx sdk.Context, delegator, provider str } } - // check if self delegation - selfdelegation := delegator == provider + entries := []*epochstoragetypes.StakeEntry{} + selfEntries := []*epochstoragetypes.StakeEntry{} - entries := []epochstoragetypes.StakeEntry{} + // get all entries + TotalSelfDelegation := sdk.ZeroInt() for _, chain := range metadata.Chains { entry, found := k.epochstorageKeeper.GetStakeEntryCurrent(ctx, chain, provider) if !found { - panic("AfterDelegationModified: entry not found ") + panic("AfterDelegationModified: entry not found") } - entries = append(entries, entry) - if !selfdelegation && entry.Vault == delegator { - selfdelegation = true + + entries = append(entries, &entry) + if entry.Vault == delegator { + selfEntries = append(selfEntries, &entry) } + TotalSelfDelegation = TotalSelfDelegation.Add(entry.Stake.Amount) } - if increase { - if selfdelegation { - metadata.SelfDelegation = metadata.SelfDelegation.Add(amount) - } else { + // regular delegation + if len(selfEntries) == 0 { + if increase { metadata.TotalDelegations = metadata.TotalDelegations.Add(amount) - } - } else { - if selfdelegation { - metadata.SelfDelegation, err = metadata.SelfDelegation.SafeSub(amount) } else { metadata.TotalDelegations, err = metadata.TotalDelegations.SafeSub(amount) } } + if err != nil { return err } @@ -139,24 +138,36 @@ func (k Keeper) AfterDelegationModified(ctx sdk.Context, delegator, provider str "provider": provider, } + // distribute self delegations if done through the dualstaking tx + if !stake { + total := amount.Amount + count := int64(len(selfEntries)) + for _, entry := range selfEntries { + part := total.QuoRaw(count) + if increase { + entry.Stake = entry.Stake.AddAmount(part) + } else { + entry.Stake = entry.Stake.SubAmount(part) + if entry.Stake.IsLT(k.GetParams(ctx).MinSelfDelegation) { + return utils.LavaFormatError("self delegation below minimum, use unstake tx", nil, utils.LogAttr("chainID", entry.Chain)) + } + } + total = total.Sub(part) + count-- + } + } + for _, entry := range entries { details[entry.Chain] = entry.Chain - if entry.Stake.IsLT(k.GetParams(ctx).MinSelfDelegation) { - k.epochstorageKeeper.RemoveStakeEntryCurrent(ctx, entry.Chain, entry.Address) - details["min_self_delegation"] = k.GetParams(ctx).MinSelfDelegation.String() - utils.LogLavaEvent(ctx, k.Logger(ctx), types.UnstakeFromUnbond, details, "unstaking provider due to unbond that lowered its stake below min self delegation") - continue - } - entry.DelegateTotal = sdk.NewCoin(amount.Denom, metadata.TotalDelegations.Amount.Mul(entry.Stake.Amount).Quo(metadata.SelfDelegation.Amount)) + entry.DelegateTotal = sdk.NewCoin(amount.Denom, metadata.TotalDelegations.Amount.Mul(entry.Stake.Amount).Quo(TotalSelfDelegation)) if entry.TotalStake().LT(k.specKeeper.GetMinStake(ctx, entry.Chain).Amount) { details["min_spec_stake"] = k.specKeeper.GetMinStake(ctx, entry.Chain).String() utils.LogLavaEvent(ctx, k.Logger(ctx), types.FreezeFromUnbond, details, "freezing provider due to stake below min spec stake") entry.Freeze() - } else if delegator == entry.Vault && entry.IsFrozen() && !entry.IsJailed(ctx.BlockTime().UTC().Unix()) { entry.UnFreeze(k.epochstorageKeeper.GetCurrentNextEpoch(ctx) + 1) } - k.epochstorageKeeper.SetStakeEntryCurrent(ctx, entry) + k.epochstorageKeeper.SetStakeEntryCurrent(ctx, *entry) } return nil @@ -164,7 +175,7 @@ func (k Keeper) AfterDelegationModified(ctx sdk.Context, delegator, provider str // delegate lets a delegator delegate an amount of coins to a provider. // (effective on next epoch) -func (k Keeper) delegate(ctx sdk.Context, delegator, provider string, amount sdk.Coin) error { +func (k Keeper) delegate(ctx sdk.Context, delegator, provider string, amount sdk.Coin, stake bool) error { _, err := sdk.AccAddressFromBech32(delegator) if err != nil { return utils.LavaFormatWarning("invalid delegator address", err, @@ -187,7 +198,7 @@ func (k Keeper) delegate(ctx sdk.Context, delegator, provider string, amount sdk ) } - err = k.increaseDelegation(ctx, delegator, provider, amount) + err = k.increaseDelegation(ctx, delegator, provider, amount, stake) if err != nil { return utils.LavaFormatWarning("failed to increase delegation", err, utils.Attribute{Key: "delegator", Value: delegator}, @@ -202,7 +213,7 @@ func (k Keeper) delegate(ctx sdk.Context, delegator, provider string, amount sdk // Redelegate lets a delegator transfer its delegation between providers, but // without the funds being subject to unstakeHoldBlocks witholding period. // (effective on next epoch) -func (k Keeper) Redelegate(ctx sdk.Context, delegator, from, to string, amount sdk.Coin) error { +func (k Keeper) Redelegate(ctx sdk.Context, delegator, from, to string, amount sdk.Coin, stake bool) error { if _, err := sdk.AccAddressFromBech32(delegator); err != nil { return utils.LavaFormatWarning("invalid delegator address", err, utils.Attribute{Key: "delegator", Value: delegator}, @@ -232,7 +243,7 @@ func (k Keeper) Redelegate(ctx sdk.Context, delegator, from, to string, amount s ) } - err := k.increaseDelegation(ctx, delegator, to, amount) + err := k.increaseDelegation(ctx, delegator, to, amount, stake) if err != nil { return utils.LavaFormatWarning("failed to increase delegation", err, utils.Attribute{Key: "delegator", Value: delegator}, @@ -241,7 +252,7 @@ func (k Keeper) Redelegate(ctx sdk.Context, delegator, from, to string, amount s ) } - err = k.decreaseDelegation(ctx, delegator, from, amount) + err = k.decreaseDelegation(ctx, delegator, from, amount, stake) if err != nil { return utils.LavaFormatWarning("failed to decrease delegation", err, utils.Attribute{Key: "delegator", Value: delegator}, @@ -261,7 +272,7 @@ func (k Keeper) Redelegate(ctx sdk.Context, delegator, from, to string, amount s // before released and transferred back to the delegator. The rewards from the // provider will be updated accordingly (or terminate) from the next epoch. // (effective on next epoch) -func (k Keeper) unbond(ctx sdk.Context, delegator, provider string, amount sdk.Coin) error { +func (k Keeper) unbond(ctx sdk.Context, delegator, provider string, amount sdk.Coin, stake bool) error { if _, err := sdk.AccAddressFromBech32(delegator); err != nil { return utils.LavaFormatWarning("invalid delegator address", err, utils.Attribute{Key: "delegator", Value: delegator}, @@ -283,7 +294,7 @@ func (k Keeper) unbond(ctx sdk.Context, delegator, provider string, amount sdk.C ) } - err := k.decreaseDelegation(ctx, delegator, provider, amount) + err := k.decreaseDelegation(ctx, delegator, provider, amount, stake) if err != nil { return utils.LavaFormatWarning("failed to decrease delegation", err, utils.Attribute{Key: "delegator", Value: delegator}, @@ -372,10 +383,10 @@ func (k Keeper) UnbondUniformProviders(ctx sdk.Context, delegator string, amount if found { if delegation.Amount.Amount.GTE(amount.Amount) { // we have enough here, remove all from empty delegator and bail - return k.unbond(ctx, delegator, commontypes.EMPTY_PROVIDER, amount) + return k.unbond(ctx, delegator, commontypes.EMPTY_PROVIDER, amount, false) } else { // we dont have enough in the empty provider, remove everything and continue with the rest - err = k.unbond(ctx, delegator, commontypes.EMPTY_PROVIDER, delegation.Amount) + err = k.unbond(ctx, delegator, commontypes.EMPTY_PROVIDER, delegation.Amount, false) if err != nil { return err } @@ -432,7 +443,7 @@ func (k Keeper) UnbondUniformProviders(ctx sdk.Context, delegator string, amount // now unbond all for i := range delegations { key := delegations[i].Provider - err := k.unbond(ctx, delegator, delegations[i].Provider, unbondAmount[key]) + err := k.unbond(ctx, delegator, delegations[i].Provider, unbondAmount[key], false) if err != nil { return err } diff --git a/x/dualstaking/keeper/msg_server_delegate.go b/x/dualstaking/keeper/msg_server_delegate.go index d0445aad9b..eeeab8ab58 100644 --- a/x/dualstaking/keeper/msg_server_delegate.go +++ b/x/dualstaking/keeper/msg_server_delegate.go @@ -12,11 +12,11 @@ import ( func (k msgServer) Delegate(goCtx context.Context, msg *types.MsgDelegate) (*types.MsgDelegateResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - return &types.MsgDelegateResponse{}, k.Keeper.DelegateFull(ctx, msg.Creator, msg.Validator, msg.Provider, msg.Amount) + return &types.MsgDelegateResponse{}, k.Keeper.DelegateFull(ctx, msg.Creator, msg.Validator, msg.Provider, msg.Amount, false) } // DelegateFull uses staking module for to delegate with hooks -func (k Keeper) DelegateFull(ctx sdk.Context, delegator string, validator string, provider string, amount sdk.Coin) error { +func (k Keeper) DelegateFull(ctx sdk.Context, delegator string, validator string, provider string, amount sdk.Coin, stake bool) error { valAddr, valErr := sdk.ValAddressFromBech32(validator) if valErr != nil { return valErr @@ -61,6 +61,7 @@ func (k Keeper) DelegateFull(ctx sdk.Context, delegator string, validator string commontypes.EMPTY_PROVIDER, provider, amount, + stake, ) if err == nil { diff --git a/x/dualstaking/keeper/msg_server_redelegate.go b/x/dualstaking/keeper/msg_server_redelegate.go index bb601c3db7..2f11eaaa46 100644 --- a/x/dualstaking/keeper/msg_server_redelegate.go +++ b/x/dualstaking/keeper/msg_server_redelegate.go @@ -25,6 +25,7 @@ func (k msgServer) Redelegate(goCtx context.Context, msg *types.MsgRedelegate) ( msg.FromProvider, msg.ToProvider, msg.Amount, + false, ) if err == nil { diff --git a/x/dualstaking/keeper/msg_server_unbond.go b/x/dualstaking/keeper/msg_server_unbond.go index 034940c1f9..1d79bfe5b3 100644 --- a/x/dualstaking/keeper/msg_server_unbond.go +++ b/x/dualstaking/keeper/msg_server_unbond.go @@ -15,7 +15,7 @@ func (k msgServer) Unbond(goCtx context.Context, msg *types.MsgUnbond) (*types.M } // UnbondFul uses staking module for to unbond with hooks -func (k Keeper) UnbondFull(ctx sdk.Context, delegator string, validator string, provider string, amount sdk.Coin, unstake bool) error { +func (k Keeper) UnbondFull(ctx sdk.Context, delegator string, validator string, provider string, amount sdk.Coin, stake bool) error { // 1.redelegate from the provider to the empty provider // 2.calls staking module to unbond from the validator // 3.calls the hooks to than unbond from the empty provider @@ -46,6 +46,7 @@ func (k Keeper) UnbondFull(ctx sdk.Context, delegator string, validator string, provider, commontypes.EMPTY_PROVIDER, amount, + stake, ) if err != nil { return err diff --git a/x/dualstaking/types/keys.go b/x/dualstaking/types/keys.go index f3c2367c0f..73c73a8849 100644 --- a/x/dualstaking/types/keys.go +++ b/x/dualstaking/types/keys.go @@ -32,5 +32,7 @@ func DelegationKey(provider, delegator string) collections.Pair[string, string] return collections.Join(provider, delegator) } -var DelegationsPrefix = collections.NewPrefix([]byte("Delegations/")) -var RewardPrefix = collections.NewPrefix([]byte("Rewards/")) +var ( + DelegationsPrefix = collections.NewPrefix([]byte("Delegations/")) + RewardPrefix = collections.NewPrefix([]byte("Rewards/")) +) diff --git a/x/epochstorage/keeper/stake_entries.go b/x/epochstorage/keeper/stake_entries.go index 42644659db..ad2abcec6e 100644 --- a/x/epochstorage/keeper/stake_entries.go +++ b/x/epochstorage/keeper/stake_entries.go @@ -2,7 +2,6 @@ package keeper import ( "fmt" - "slices" "sort" "strconv" @@ -180,21 +179,6 @@ func (k Keeper) SetStakeEntryCurrent(ctx sdk.Context, stakeEntry types.StakeEntr if err != nil { panic(fmt.Errorf("SetStakeEntryCurrent: Failed to set entry for key %v, error: %w", key, err)) } - - metadata, err := k.GetMetadata(ctx, stakeEntry.Address) - if err != nil { - // init metadata - metadata = types.ProviderMetadata{ - Provider: stakeEntry.Address, - Chains: []string{}, - SelfDelegation: sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), sdk.ZeroInt()), - TotalDelegations: sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), sdk.ZeroInt()), - } - } - if !slices.Contains(metadata.Chains, stakeEntry.Chain) { - metadata.Chains = append(metadata.Chains, stakeEntry.Chain) - } - k.SetMetadata(ctx, metadata) } // RemoveStakeEntryCurrent deletes a current stake entry from the store diff --git a/x/epochstorage/types/provider_metadata.pb.go b/x/epochstorage/types/provider_metadata.pb.go index a03b3043db..2dac9ff57b 100644 --- a/x/epochstorage/types/provider_metadata.pb.go +++ b/x/epochstorage/types/provider_metadata.pb.go @@ -27,7 +27,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type ProviderMetadata struct { Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` - SelfDelegation types.Coin `protobuf:"bytes,2,opt,name=SelfDelegation,proto3" json:"SelfDelegation"` + Vault string `protobuf:"bytes,2,opt,name=vault,proto3" json:"vault,omitempty"` TotalDelegations types.Coin `protobuf:"bytes,3,opt,name=TotalDelegations,proto3" json:"TotalDelegations"` Chains []string `protobuf:"bytes,4,rep,name=chains,proto3" json:"chains,omitempty"` } @@ -72,11 +72,11 @@ func (m *ProviderMetadata) GetProvider() string { return "" } -func (m *ProviderMetadata) GetSelfDelegation() types.Coin { +func (m *ProviderMetadata) GetVault() string { if m != nil { - return m.SelfDelegation + return m.Vault } - return types.Coin{} + return "" } func (m *ProviderMetadata) GetTotalDelegations() types.Coin { @@ -102,26 +102,26 @@ func init() { } var fileDescriptor_eea88d8dbfad23fd = []byte{ - // 302 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0x4f, 0x4b, 0xc3, 0x30, - 0x14, 0xc0, 0x1b, 0x37, 0x86, 0x8b, 0x20, 0xb3, 0x88, 0x74, 0x3b, 0xc4, 0xe1, 0x69, 0xa7, 0x84, - 0xb9, 0x6f, 0x30, 0x05, 0x11, 0x11, 0x64, 0x7a, 0xf2, 0x22, 0xaf, 0x5d, 0xec, 0x02, 0x6d, 0x5e, - 0x69, 0x62, 0xd1, 0x6f, 0xe1, 0xc7, 0xda, 0x71, 0x47, 0x0f, 0x22, 0xb2, 0x7e, 0x11, 0x69, 0x1b, - 0xff, 0x4c, 0x2f, 0x5e, 0xf2, 0xf2, 0x5e, 0xf2, 0xcb, 0x2f, 0xbc, 0x47, 0xc7, 0x09, 0x14, 0xa0, - 0xa5, 0x15, 0x55, 0x14, 0x32, 0xc3, 0x68, 0x61, 0x2c, 0xe6, 0x10, 0x4b, 0x91, 0xe5, 0x58, 0xa8, - 0xb9, 0xcc, 0xef, 0x52, 0x69, 0x61, 0x0e, 0x16, 0x78, 0x96, 0xa3, 0x45, 0xbf, 0xef, 0x10, 0x5e, - 0x45, 0xfe, 0x13, 0x19, 0xec, 0xc7, 0x18, 0x63, 0x7d, 0x4b, 0x54, 0xbb, 0x06, 0x18, 0xb0, 0x08, - 0x4d, 0x8a, 0x46, 0x84, 0x60, 0xa4, 0x28, 0xc6, 0xa1, 0xb4, 0x30, 0x16, 0x11, 0x2a, 0xed, 0xce, - 0xf7, 0x20, 0x55, 0x1a, 0x45, 0xbd, 0x36, 0xa5, 0xa3, 0x57, 0x42, 0x7b, 0x57, 0xce, 0x7f, 0xe9, - 0xf4, 0xfe, 0x80, 0x6e, 0x7f, 0xfe, 0x29, 0x20, 0x43, 0x32, 0xea, 0xce, 0xbe, 0x72, 0xff, 0x8c, - 0xee, 0x5e, 0xcb, 0xe4, 0xfe, 0x54, 0x26, 0x32, 0x06, 0xab, 0x50, 0x07, 0x5b, 0x43, 0x32, 0xda, - 0x39, 0xee, 0xf3, 0x46, 0xce, 0x2b, 0x39, 0x77, 0x72, 0x7e, 0x82, 0x4a, 0x4f, 0xdb, 0xcb, 0xb7, - 0x43, 0x6f, 0xf6, 0x0b, 0xf3, 0x2f, 0x68, 0xef, 0x06, 0x2d, 0x24, 0xdf, 0x25, 0x13, 0xb4, 0xfe, - 0xf7, 0xd4, 0x1f, 0xd0, 0x3f, 0xa0, 0x9d, 0x68, 0x01, 0x4a, 0x9b, 0xa0, 0x3d, 0x6c, 0x8d, 0xba, - 0x33, 0x97, 0x4d, 0xcf, 0x97, 0x6b, 0x46, 0x56, 0x6b, 0x46, 0xde, 0xd7, 0x8c, 0x3c, 0x97, 0xcc, - 0x5b, 0x95, 0xcc, 0x7b, 0x29, 0x99, 0x77, 0x2b, 0x62, 0x65, 0x17, 0x0f, 0x21, 0x8f, 0x30, 0x15, - 0x1b, 0xa3, 0x29, 0x26, 0xe2, 0x71, 0x73, 0x3e, 0xf6, 0x29, 0x93, 0x26, 0xec, 0xd4, 0x0d, 0x9b, - 0x7c, 0x04, 0x00, 0x00, 0xff, 0xff, 0x4c, 0x2e, 0xe7, 0x8c, 0xc9, 0x01, 0x00, 0x00, + // 298 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0xb1, 0x4e, 0xc3, 0x30, + 0x10, 0x86, 0x63, 0x5a, 0x2a, 0x6a, 0x96, 0x12, 0x55, 0x28, 0xed, 0x60, 0x2a, 0xa6, 0x4e, 0xb6, + 0x4a, 0xdf, 0xa0, 0xb0, 0x20, 0x84, 0x84, 0x2a, 0x26, 0x16, 0x74, 0x49, 0xad, 0xc4, 0x52, 0xe2, + 0x8b, 0x62, 0x37, 0x82, 0xb7, 0xe0, 0x35, 0x78, 0x93, 0x8e, 0x1d, 0x99, 0x10, 0x4a, 0x5e, 0x04, + 0x25, 0x31, 0x88, 0x8a, 0xc5, 0xe7, 0xdf, 0xe7, 0x5f, 0xf7, 0xdd, 0x4f, 0x17, 0x29, 0x94, 0xa0, + 0xa5, 0x15, 0x4d, 0x15, 0x32, 0xc7, 0x28, 0x31, 0x16, 0x0b, 0x88, 0xa5, 0xc8, 0x0b, 0x2c, 0xd5, + 0x46, 0x16, 0xcf, 0x99, 0xb4, 0xb0, 0x01, 0x0b, 0x3c, 0x2f, 0xd0, 0xa2, 0x3f, 0x71, 0x16, 0xde, + 0x54, 0xfe, 0xd7, 0x32, 0x1d, 0xc7, 0x18, 0x63, 0xfb, 0x4b, 0x34, 0xb7, 0xce, 0x30, 0x65, 0x11, + 0x9a, 0x0c, 0x8d, 0x08, 0xc1, 0x48, 0x51, 0x2e, 0x42, 0x69, 0x61, 0x21, 0x22, 0x54, 0xda, 0xf5, + 0xcf, 0x20, 0x53, 0x1a, 0x45, 0x7b, 0x76, 0x4f, 0x97, 0xef, 0x84, 0x8e, 0x1e, 0xdc, 0xfc, 0x7b, + 0x37, 0xde, 0x9f, 0xd2, 0x93, 0x1f, 0xa6, 0x80, 0xcc, 0xc8, 0x7c, 0xb8, 0xfe, 0xd5, 0xfe, 0x98, + 0x1e, 0x97, 0xb0, 0x4d, 0x6d, 0x70, 0xd4, 0x36, 0x3a, 0xe1, 0xdf, 0xd1, 0xd1, 0x23, 0x5a, 0x48, + 0x6f, 0x64, 0x2a, 0x63, 0xb0, 0x0a, 0xb5, 0x09, 0x7a, 0x33, 0x32, 0x3f, 0xbd, 0x9a, 0xf0, 0x0e, + 0x8a, 0x37, 0x50, 0xdc, 0x41, 0xf1, 0x6b, 0x54, 0x7a, 0xd5, 0xdf, 0x7d, 0x5e, 0x78, 0xeb, 0x7f, + 0x46, 0xff, 0x9c, 0x0e, 0xa2, 0x04, 0x94, 0x36, 0x41, 0x7f, 0xd6, 0x9b, 0x0f, 0xd7, 0x4e, 0xad, + 0x6e, 0x77, 0x15, 0x23, 0xfb, 0x8a, 0x91, 0xaf, 0x8a, 0x91, 0xb7, 0x9a, 0x79, 0xfb, 0x9a, 0x79, + 0x1f, 0x35, 0xf3, 0x9e, 0x44, 0xac, 0x6c, 0xb2, 0x0d, 0x79, 0x84, 0x99, 0x38, 0xc8, 0xb9, 0x5c, + 0x8a, 0x97, 0xc3, 0xb0, 0xed, 0x6b, 0x2e, 0x4d, 0x38, 0x68, 0xb7, 0x5f, 0x7e, 0x07, 0x00, 0x00, + 0xff, 0xff, 0x2f, 0x07, 0x8d, 0xb1, 0x96, 0x01, 0x00, 0x00, } func (m *ProviderMetadata) Marshal() (dAtA []byte, err error) { @@ -163,16 +163,13 @@ func (m *ProviderMetadata) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - { - size, err := m.SelfDelegation.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintProviderMetadata(dAtA, i, uint64(size)) + if len(m.Vault) > 0 { + i -= len(m.Vault) + copy(dAtA[i:], m.Vault) + i = encodeVarintProviderMetadata(dAtA, i, uint64(len(m.Vault))) + i-- + dAtA[i] = 0x12 } - i-- - dAtA[i] = 0x12 if len(m.Provider) > 0 { i -= len(m.Provider) copy(dAtA[i:], m.Provider) @@ -204,8 +201,10 @@ func (m *ProviderMetadata) Size() (n int) { if l > 0 { n += 1 + l + sovProviderMetadata(uint64(l)) } - l = m.SelfDelegation.Size() - n += 1 + l + sovProviderMetadata(uint64(l)) + l = len(m.Vault) + if l > 0 { + n += 1 + l + sovProviderMetadata(uint64(l)) + } l = m.TotalDelegations.Size() n += 1 + l + sovProviderMetadata(uint64(l)) if len(m.Chains) > 0 { @@ -286,9 +285,9 @@ func (m *ProviderMetadata) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SelfDelegation", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Vault", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowProviderMetadata @@ -298,24 +297,23 @@ func (m *ProviderMetadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthProviderMetadata } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthProviderMetadata } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.SelfDelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Vault = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { diff --git a/x/pairing/keeper/staking.go b/x/pairing/keeper/staking.go index 0e7bc580a8..3785cf84db 100644 --- a/x/pairing/keeper/staking.go +++ b/x/pairing/keeper/staking.go @@ -2,6 +2,7 @@ package keeper import ( "fmt" + "slices" "strconv" "time" @@ -23,6 +24,28 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin logger := k.Logger(ctx) specChainID := chainID + metadata, err := k.epochStorageKeeper.GetMetadata(ctx, provider) + if err != nil { + metadata = epochstoragetypes.ProviderMetadata{ + Provider: provider, + Vault: creator, + Chains: []string{chainID}, + TotalDelegations: sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), sdk.ZeroInt()), + } + } + + if creator != metadata.Vault { + return utils.LavaFormatWarning("creator does not match the provider vault", err, + utils.Attribute{Key: "vault", Value: metadata.Vault}, + utils.Attribute{Key: "creator", Value: creator}, + ) + } + + if !slices.Contains(metadata.Chains, chainID) { + metadata.Chains = append(metadata.Chains, chainID) + } + k.epochStorageKeeper.SetMetadata(ctx, metadata) + spec, err := k.specKeeper.GetExpandedSpec(ctx, specChainID) if err != nil || !spec.Enabled { return utils.LavaFormatWarning("spec not found or not active", err, @@ -31,14 +54,6 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin } // if we get here, the spec is active and supported - if amount.IsLT(k.dualstakingKeeper.MinSelfDelegation(ctx)) { // we count on this to also check the denom - return utils.LavaFormatWarning("insufficient stake amount", fmt.Errorf("stake amount smaller than MinSelfDelegation"), - utils.Attribute{Key: "spec", Value: specChainID}, - utils.Attribute{Key: "provider", Value: creator}, - utils.Attribute{Key: "stake", Value: amount}, - utils.Attribute{Key: "minSelfDelegation", Value: k.dualstakingKeeper.MinSelfDelegation(ctx).String()}, - ) - } senderAddr, err := sdk.AccAddressFromBech32(creator) if err != nil { return utils.LavaFormatWarning("invalid address", err, @@ -148,6 +163,9 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin } // we dont change stakeAppliedBlocks and chain once they are set, if they need to change, unstake first + beforeAmount := existingEntry.Stake + increase := amount.Amount.GT(existingEntry.Stake.Amount) + decrease := amount.Amount.LT(existingEntry.Stake.Amount) existingEntry.Geolocation = geolocation existingEntry.Endpoints = endpointsVerified existingEntry.Description = description @@ -157,23 +175,23 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin k.epochStorageKeeper.SetStakeEntryCurrent(ctx, existingEntry) - if amount.Amount.GT(existingEntry.Stake.Amount) { + if increase { // delegate the difference - diffAmount := amount.Sub(existingEntry.Stake) - err = k.dualstakingKeeper.DelegateFull(ctx, existingEntry.Vault, validator, existingEntry.Address, diffAmount) + diffAmount := amount.Sub(beforeAmount) + err = k.dualstakingKeeper.DelegateFull(ctx, existingEntry.Vault, validator, existingEntry.Address, diffAmount, true) if err != nil { details = append(details, utils.Attribute{Key: "neededStake", Value: amount.Sub(existingEntry.Stake).String()}) - return utils.LavaFormatWarning("insufficient funds to pay for difference in stake", err, + return utils.LavaFormatWarning("failed to increase stake", err, details..., ) } - } else if amount.Amount.LT(existingEntry.Stake.Amount) { + } else if decrease { // unbond the difference - diffAmount := existingEntry.Stake.Sub(amount) - err = k.dualstakingKeeper.UnbondFull(ctx, existingEntry.Vault, validator, existingEntry.Address, diffAmount, false) + diffAmount := beforeAmount.Sub(amount) + err = k.dualstakingKeeper.UnbondFull(ctx, existingEntry.Vault, validator, existingEntry.Address, diffAmount, true) if err != nil { details = append(details, utils.Attribute{Key: "neededStake", Value: amount.Sub(existingEntry.Stake).String()}) - return utils.LavaFormatWarning("insufficient funds to pay for difference in stake", err, + return utils.LavaFormatWarning("failed to decrease stake", err, details..., ) } @@ -221,8 +239,25 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin ) } + stakeAmount := amount + if len(metadata.Chains) == 1 { + delegation, found := k.dualstakingKeeper.GetDelegation(ctx, creator, provider) + if found { + stakeAmount = stakeAmount.Add(delegation.Amount) + } + } + + if stakeAmount.IsLT(k.dualstakingKeeper.MinSelfDelegation(ctx)) { // we count on this to also check the denom + return utils.LavaFormatWarning("insufficient stake amount", fmt.Errorf("stake amount smaller than MinSelfDelegation"), + utils.Attribute{Key: "spec", Value: specChainID}, + utils.Attribute{Key: "provider", Value: creator}, + utils.Attribute{Key: "stake", Value: amount}, + utils.Attribute{Key: "minSelfDelegation", Value: k.dualstakingKeeper.MinSelfDelegation(ctx).String()}, + ) + } + stakeEntry := epochstoragetypes.StakeEntry{ - Stake: amount, + Stake: stakeAmount, Address: provider, StakeAppliedBlock: stakeAppliedBlock, Endpoints: endpointsVerified, @@ -237,7 +272,7 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin k.epochStorageKeeper.SetStakeEntryCurrent(ctx, stakeEntry) - err = k.dualstakingKeeper.DelegateFull(ctx, stakeEntry.Vault, validator, stakeEntry.Address, amount) + err = k.dualstakingKeeper.DelegateFull(ctx, stakeEntry.Vault, validator, stakeEntry.Address, amount, true) if err != nil { return utils.LavaFormatWarning("provider self delegation failed", err, details..., diff --git a/x/pairing/keeper/unstaking.go b/x/pairing/keeper/unstaking.go index 980e2385fe..3b77fbb1da 100644 --- a/x/pairing/keeper/unstaking.go +++ b/x/pairing/keeper/unstaking.go @@ -36,7 +36,7 @@ func (k Keeper) UnstakeEntry(ctx sdk.Context, validator, chainID, creator, unsta ) } - if creator != existingEntry.Vault { + if creator != existingEntry.Vault && creator != existingEntry.Address { return utils.LavaFormatWarning("can't unstake entry with provider address, only vault address is allowed to unstake", fmt.Errorf("provider unstake failed"), utils.LogAttr("creator", creator), utils.LogAttr("provider", existingEntry.Address), @@ -46,16 +46,39 @@ func (k Keeper) UnstakeEntry(ctx sdk.Context, validator, chainID, creator, unsta } amount := existingEntry.Stake - existingEntry.Stake.Amount = sdk.ZeroInt() - k.epochStorageKeeper.SetStakeEntryCurrent(ctx, existingEntry) + k.epochStorageKeeper.RemoveStakeEntryCurrent(ctx, existingEntry.Chain, existingEntry.Address) - // the stake entry is removed inside UnbondFull - err := k.dualstakingKeeper.UnbondFull(ctx, existingEntry.Vault, validator, existingEntry.Address, amount, true) - if err != nil { - return utils.LavaFormatWarning("can't unbond self delegation", err, - utils.Attribute{Key: "address", Value: existingEntry.Address}, - utils.Attribute{Key: "spec", Value: chainID}, - ) + if existingEntry.Vault == creator { + // remove delegation + err := k.dualstakingKeeper.UnbondFull(ctx, existingEntry.Vault, validator, existingEntry.Address, amount, true) + if err != nil { + return utils.LavaFormatWarning("can't unbond self delegation", err, + utils.Attribute{Key: "address", Value: existingEntry.Address}, + utils.Attribute{Key: "spec", Value: chainID}, + ) + } + } else { + // provider is not vault so delegation stays. + // distribute stake between other chains + metadata, err := k.epochStorageKeeper.GetMetadata(ctx, existingEntry.Address) + if err == nil { + total := amount.Amount + count := int64(len(metadata.Chains)) + for _, chain := range metadata.Chains { + entry, found := k.epochStorageKeeper.GetStakeEntryCurrent(ctx, chain, existingEntry.Address) + if !found { + utils.LavaFormatError("did not find stake entry that exists in metadata", nil, + utils.LogAttr("provider", existingEntry.Address), + utils.LogAttr("chain", chain), + ) + continue + } + part := total.QuoRaw(count) + entry.Stake = entry.Stake.AddAmount(part) + total = total.Sub(part) + count-- + } + } } details := map[string]string{ diff --git a/x/pairing/types/expected_keepers.go b/x/pairing/types/expected_keepers.go index dc64f8e35a..19a6c7648d 100644 --- a/x/pairing/types/expected_keepers.go +++ b/x/pairing/types/expected_keepers.go @@ -32,7 +32,6 @@ type SpecKeeper interface { type EpochstorageKeeper interface { // Methods imported from epochStorage should be defined here // Methods imported from bank should be defined here - GetParamForBlock(ctx sdk.Context, fixationKey string, block uint64, param any) error GetEpochStart(ctx sdk.Context) uint64 GetEarliestEpochStart(ctx sdk.Context) uint64 IsEpochStart(ctx sdk.Context) (res bool) @@ -41,7 +40,6 @@ type EpochstorageKeeper interface { GetEpochStartForBlock(ctx sdk.Context, block uint64) (epochStart, blockInEpoch uint64, err error) GetPreviousEpochStartForBlock(ctx sdk.Context, block uint64) (previousEpochStart uint64, erro error) GetNextEpoch(ctx sdk.Context, block uint64) (nextEpoch uint64, erro error) - GetCurrentNextEpoch(ctx sdk.Context) (nextEpoch uint64) AddFixationRegistry(fixationKey string, getParamFunction func(sdk.Context) any) GetDeletedEpochs(ctx sdk.Context) []uint64 EpochBlocks(ctx sdk.Context, block uint64) (res uint64, err error) @@ -53,6 +51,8 @@ type EpochstorageKeeper interface { GetAllStakeEntriesCurrent(ctx sdk.Context) []epochstoragetypes.StakeEntry RemoveStakeEntryCurrent(ctx sdk.Context, chainID string, provider string) GetEpochHash(ctx sdk.Context, epoch uint64) []byte + GetMetadata(ctx sdk.Context, provider string) (epochstoragetypes.ProviderMetadata, error) + SetMetadata(ctx sdk.Context, metadata epochstoragetypes.ProviderMetadata) } type AccountKeeper interface { @@ -103,10 +103,11 @@ type DowntimeKeeper interface { type DualstakingKeeper interface { RewardProvidersAndDelegators(ctx sdk.Context, providerAddr string, chainID string, totalReward sdk.Coins, senderModule string, calcOnlyProvider bool, calcOnlyDelegators bool, calcOnlyContributor bool) (providerReward sdk.Coins, totalRewards sdk.Coins, err error) - DelegateFull(ctx sdk.Context, delegator string, validator string, provider string, amount sdk.Coin) error - UnbondFull(ctx sdk.Context, delegator string, validator string, provider string, amount sdk.Coin, unstake bool) error + DelegateFull(ctx sdk.Context, delegator string, validator string, provider string, amount sdk.Coin, stake bool) error + UnbondFull(ctx sdk.Context, delegator string, validator string, provider string, amount sdk.Coin, stake bool) error GetProviderDelegators(ctx sdk.Context, provider string) ([]dualstakingtypes.Delegation, error) MinSelfDelegation(ctx sdk.Context) sdk.Coin + GetDelegation(ctx sdk.Context, provider, delegator string) (dualstakingtypes.Delegation, bool) } type FixationStoreKeeper interface { From f475c1cb647c3746519329020527b4afa4c307c6 Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Mon, 16 Sep 2024 14:31:12 +0300 Subject: [PATCH 10/27] fix --- x/pairing/types/expected_keepers.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x/pairing/types/expected_keepers.go b/x/pairing/types/expected_keepers.go index 19a6c7648d..18b0ca9af3 100644 --- a/x/pairing/types/expected_keepers.go +++ b/x/pairing/types/expected_keepers.go @@ -32,6 +32,7 @@ type SpecKeeper interface { type EpochstorageKeeper interface { // Methods imported from epochStorage should be defined here // Methods imported from bank should be defined here + GetParamForBlock(ctx sdk.Context, fixationKey string, block uint64, param any) error GetEpochStart(ctx sdk.Context) uint64 GetEarliestEpochStart(ctx sdk.Context) uint64 IsEpochStart(ctx sdk.Context) (res bool) @@ -40,6 +41,7 @@ type EpochstorageKeeper interface { GetEpochStartForBlock(ctx sdk.Context, block uint64) (epochStart, blockInEpoch uint64, err error) GetPreviousEpochStartForBlock(ctx sdk.Context, block uint64) (previousEpochStart uint64, erro error) GetNextEpoch(ctx sdk.Context, block uint64) (nextEpoch uint64, erro error) + GetCurrentNextEpoch(ctx sdk.Context) (nextEpoch uint64) AddFixationRegistry(fixationKey string, getParamFunction func(sdk.Context) any) GetDeletedEpochs(ctx sdk.Context) []uint64 EpochBlocks(ctx sdk.Context, block uint64) (res uint64, err error) From 367b3b30a9da2281b37b0fd514b7f7acf8768951 Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Mon, 16 Sep 2024 14:33:33 +0300 Subject: [PATCH 11/27] now all entries are self --- x/dualstaking/keeper/delegate.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/x/dualstaking/keeper/delegate.go b/x/dualstaking/keeper/delegate.go index 1884fee208..decb11f67a 100644 --- a/x/dualstaking/keeper/delegate.go +++ b/x/dualstaking/keeper/delegate.go @@ -102,11 +102,9 @@ func (k Keeper) AfterDelegationModified(ctx sdk.Context, delegator, provider str } } - entries := []*epochstoragetypes.StakeEntry{} - selfEntries := []*epochstoragetypes.StakeEntry{} - // get all entries TotalSelfDelegation := sdk.ZeroInt() + entries := []*epochstoragetypes.StakeEntry{} for _, chain := range metadata.Chains { entry, found := k.epochstorageKeeper.GetStakeEntryCurrent(ctx, chain, provider) if !found { @@ -114,14 +112,11 @@ func (k Keeper) AfterDelegationModified(ctx sdk.Context, delegator, provider str } entries = append(entries, &entry) - if entry.Vault == delegator { - selfEntries = append(selfEntries, &entry) - } TotalSelfDelegation = TotalSelfDelegation.Add(entry.Stake.Amount) } // regular delegation - if len(selfEntries) == 0 { + if delegator != metadata.Vault { if increase { metadata.TotalDelegations = metadata.TotalDelegations.Add(amount) } else { @@ -141,8 +136,8 @@ func (k Keeper) AfterDelegationModified(ctx sdk.Context, delegator, provider str // distribute self delegations if done through the dualstaking tx if !stake { total := amount.Amount - count := int64(len(selfEntries)) - for _, entry := range selfEntries { + count := int64(len(entries)) + for _, entry := range entries { part := total.QuoRaw(count) if increase { entry.Stake = entry.Stake.AddAmount(part) From a471a576f3acfb87496a76d38765c8690e6e87f8 Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Mon, 16 Sep 2024 17:13:55 +0300 Subject: [PATCH 12/27] remove proto break check --- .github/workflows/proto.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/proto.yml b/.github/workflows/proto.yml index ad9c6f12c3..95cc07032a 100644 --- a/.github/workflows/proto.yml +++ b/.github/workflows/proto.yml @@ -23,15 +23,15 @@ jobs: # with: # input: "proto" - break-check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: bufbuild/buf-setup-action@v1.38.0 - - uses: bufbuild/buf-breaking-action@v1 - with: - input: "proto" - against: "https://github.com/${{ github.repository }}.git#branch=${{ github.event.pull_request.base.ref }},ref=HEAD~1,subdir=proto" + # break-check: + # runs-on: ubuntu-latest + # steps: + # - uses: actions/checkout@v4 + # - uses: bufbuild/buf-setup-action@v1.38.0 + # - uses: bufbuild/buf-breaking-action@v1 + # with: + # input: "proto" + # against: "https://github.com/${{ github.repository }}.git#branch=${{ github.event.pull_request.base.ref }},ref=HEAD~1,subdir=proto" validate-check: runs-on: ubuntu-latest From 09efb19471f9d1491dd4c5e6b5814c3284e8ea8c Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Thu, 19 Sep 2024 12:45:02 +0300 Subject: [PATCH 13/27] added dualstaking migrator --- x/dualstaking/keeper/migrations.go | 71 ++++++++++++++++++++++++++++++ x/dualstaking/module.go | 14 +++--- 2 files changed, 78 insertions(+), 7 deletions(-) diff --git a/x/dualstaking/keeper/migrations.go b/x/dualstaking/keeper/migrations.go index c5a2b6fb67..b8250226de 100644 --- a/x/dualstaking/keeper/migrations.go +++ b/x/dualstaking/keeper/migrations.go @@ -2,6 +2,11 @@ package keeper import ( _ "embed" + + "github.com/cosmos/cosmos-sdk/store/prefix" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/lavanet/lava/v3/x/dualstaking/types" + fixationtypes "github.com/lavanet/lava/v3/x/fixationstore/types" ) type Migrator struct { @@ -11,3 +16,69 @@ type Migrator struct { func NewMigrator(keeper Keeper) Migrator { return Migrator{keeper: keeper} } + +func (m Migrator) MigrateVersion5To6(ctx sdk.Context) error { + nextEpoch := m.keeper.epochstorageKeeper.GetCurrentNextEpoch(ctx) + + // prefix for the delegations fixation store + const ( + DelegationPrefix = "delegation-fs" + DelegatorPrefix = "delegator-fs" + UnbondingPrefix = "unbonding-ts" + DelegatorRewardKeyPrefix = "DelegatorReward/value/" + ) + + // set delegations + delegationFS := fixationtypes.NewFixationStore(m.keeper.storeKey, m.keeper.cdc, DelegationPrefix, nil, nil) + incisec := delegationFS.GetAllEntryIndices(ctx) + for _, index := range incisec { + var oldDelegation types.Delegation + found := delegationFS.FindEntry(ctx, index, nextEpoch, &oldDelegation) + if found { + delegation, found := m.keeper.GetDelegation(ctx, oldDelegation.Provider, oldDelegation.Delegator) + if found { + delegation.Amount = delegation.Amount.Add(oldDelegation.Amount) + } else { + delegation = oldDelegation + } + m.keeper.SetDelegation(ctx, delegation) + } + } + + // set rewards + store := prefix.NewStore(ctx.KVStore(m.keeper.storeKey), types.KeyPrefix(DelegatorRewardKeyPrefix)) + iterator := sdk.KVStorePrefixIterator(store, []byte{}) + + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + var val types.DelegatorReward + m.keeper.cdc.MustUnmarshal(iterator.Value(), &val) + reward, found := m.keeper.GetDelegatorReward(ctx, val.Delegator, val.Delegator) + if found { + reward.Amount = reward.Amount.Add(val.Amount...) + } else { + reward = val + } + m.keeper.SetDelegatorReward(ctx, reward) + } + + // now delete the stores + deleteStore := func(prefixString string) { + store := prefix.NewStore(ctx.KVStore(m.keeper.storeKey), types.KeyPrefix(prefixString)) + iterator := sdk.KVStorePrefixIterator(store, []byte{}) + + defer iterator.Close() + + for ; iterator.Valid(); iterator.Next() { + store.Delete(iterator.Key()) + } + } + + deleteStore(DelegationPrefix) + deleteStore(DelegatorPrefix) + deleteStore(UnbondingPrefix) + deleteStore(DelegatorRewardKeyPrefix) + + return nil +} diff --git a/x/dualstaking/module.go b/x/dualstaking/module.go index bca81034d7..31f43c1546 100644 --- a/x/dualstaking/module.go +++ b/x/dualstaking/module.go @@ -116,13 +116,13 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) types.RegisterQueryServer(cfg.QueryServer(), am.keeper) - // migrator := keeper.NewMigrator(am.keeper) + migrator := keeper.NewMigrator(am.keeper) - // // register v4 -> v5 migration - // if err := cfg.RegisterMigration(types.ModuleName, 4, migrator.MigrateVersion4To5); err != nil { - // // panic:ok: at start up, migration cannot proceed anyhow - // panic(fmt.Errorf("%s: failed to register migration to v5: %w", types.ModuleName, err)) - // } + // register v5 -> v6 migration + if err := cfg.RegisterMigration(types.ModuleName, 5, migrator.MigrateVersion5To6); err != nil { + // panic:ok: at start up, migration cannot proceed anyhow + panic(fmt.Errorf("%s: failed to register migration to v5: %w", types.ModuleName, err)) + } } // RegisterInvariants registers the invariants of the module. If an invariant deviates from its predicted value, the InvariantRegistry triggers appropriate logic (most often the chain will be halted) @@ -146,7 +146,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion is a sequence number for state-breaking change of the module. It should be incremented on each consensus-breaking change introduced by the module. To avoid wrong/empty versions, the initial version should be set to 1 -func (AppModule) ConsensusVersion() uint64 { return 5 } +func (AppModule) ConsensusVersion() uint64 { return 6 } // BeginBlock contains the logic that is automatically triggered at the beginning of each block func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { From 8fef34093fe63f97a638c1a68072498c92b792dc Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Thu, 19 Sep 2024 14:01:53 +0300 Subject: [PATCH 14/27] temp comment --- protocol/monitoring/health.go | 16 ++++++++-------- x/pairing/client/cli/tx.go | 12 ++++++------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/protocol/monitoring/health.go b/protocol/monitoring/health.go index e801b9bdf3..e0d564e34b 100644 --- a/protocol/monitoring/health.go +++ b/protocol/monitoring/health.go @@ -171,14 +171,14 @@ func RunHealth(ctx context.Context, delegations := response.GetDelegations() for _, delegation := range delegations { if delegation.Provider == providerAddress { - healthResults.setSpec(&spectypes.Spec{Index: delegation.ChainID}) - for _, apiInterface := range chainIdToApiInterfaces[delegation.ChainID] { - healthResults.SetProviderData(LavaEntity{ - Address: providerAddress, - SpecId: delegation.ChainID, - ApiInterface: apiInterface, - }, ReplyData{}) - } + // healthResults.setSpec(&spectypes.Spec{Index: delegation.ChainID}) // fix yarom + // for _, apiInterface := range chainIdToApiInterfaces[delegation.ChainID] { + // healthResults.SetProviderData(LavaEntity{ + // Address: providerAddress, + // SpecId: delegation.ChainID, + // ApiInterface: apiInterface, + // }, ReplyData{}) + // } } } return diff --git a/x/pairing/client/cli/tx.go b/x/pairing/client/cli/tx.go index 4ee4bb6fd2..efbd6c4193 100644 --- a/x/pairing/client/cli/tx.go +++ b/x/pairing/client/cli/tx.go @@ -134,12 +134,12 @@ func NewSubmitUnstakeProposalTxCmd() *cobra.Command { content.ProvidersInfo = []types.ProviderUnstakeInfo{{Provider: providerEntry.Address, ChainId: providerEntry.Chain}} content.DelegatorsSlashing = []types.DelegatorSlashing{} for _, delegator := range delegators.Delegations { - if delegator.ChainID == providerEntry.Chain { - content.DelegatorsSlashing = append(content.DelegatorsSlashing, types.DelegatorSlashing{ - Delegator: delegator.Delegator, - SlashingAmount: sdk.NewCoin(commontypes.TokenDenom, delegator.Amount.Amount.MulRaw(int64(slashfactor)).QuoRaw(100)), - }) - } + // if delegator.ChainID == providerEntry.Chain { // fix yarom + content.DelegatorsSlashing = append(content.DelegatorsSlashing, types.DelegatorSlashing{ + Delegator: delegator.Delegator, + SlashingAmount: sdk.NewCoin(commontypes.TokenDenom, delegator.Amount.Amount.MulRaw(int64(slashfactor)).QuoRaw(100)), + }) + // } } } From c04948127b95df6098bf09e4b9d224b4ea3b39eb Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Thu, 19 Sep 2024 14:46:05 +0300 Subject: [PATCH 15/27] added migration for metadata --- x/dualstaking/keeper/migrations.go | 4 ++- x/pairing/keeper/migrations.go | 41 ++++++++++++++++++++++++++++++ x/pairing/module.go | 6 ++++- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/x/dualstaking/keeper/migrations.go b/x/dualstaking/keeper/migrations.go index b8250226de..dcbfeb9604 100644 --- a/x/dualstaking/keeper/migrations.go +++ b/x/dualstaking/keeper/migrations.go @@ -7,6 +7,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/lavanet/lava/v3/x/dualstaking/types" fixationtypes "github.com/lavanet/lava/v3/x/fixationstore/types" + timerstoretypes "github.com/lavanet/lava/v3/x/timerstore/types" ) type Migrator struct { @@ -29,7 +30,8 @@ func (m Migrator) MigrateVersion5To6(ctx sdk.Context) error { ) // set delegations - delegationFS := fixationtypes.NewFixationStore(m.keeper.storeKey, m.keeper.cdc, DelegationPrefix, nil, nil) + ts := timerstoretypes.NewTimerStore(m.keeper.storeKey, m.keeper.cdc, DelegationPrefix) + delegationFS := fixationtypes.NewFixationStore(m.keeper.storeKey, m.keeper.cdc, DelegationPrefix, ts, nil) incisec := delegationFS.GetAllEntryIndices(ctx) for _, index := range incisec { var oldDelegation types.Delegation diff --git a/x/pairing/keeper/migrations.go b/x/pairing/keeper/migrations.go index fa445503f3..96d91eaff4 100644 --- a/x/pairing/keeper/migrations.go +++ b/x/pairing/keeper/migrations.go @@ -2,6 +2,7 @@ package keeper import ( sdk "github.com/cosmos/cosmos-sdk/types" + epochstoragetypes "github.com/lavanet/lava/v3/x/epochstorage/types" v2 "github.com/lavanet/lava/v3/x/pairing/migrations/v2" ) @@ -20,3 +21,43 @@ func (m Migrator) MigrateVersion2To3(ctx sdk.Context) error { v2.RemoveAllEpochPayments(ctx, m.keeper.storeKey) return nil } + +func (m Migrator) MigrateVersion4To5(ctx sdk.Context) error { + entries := m.keeper.epochStorageKeeper.GetAllStakeEntriesCurrent(ctx) + providerMap := map[string][]epochstoragetypes.StakeEntry{} + + for _, e := range entries { + providerMap[e.Address] = append(providerMap[e.Address], e) + } + + for _, entries := range providerMap { + metadata := epochstoragetypes.ProviderMetadata{} + for i, e := range entries { + if i == 0 { + metadata.Provider = e.Address + metadata.Vault = e.Vault + } + metadata.Chains = append(metadata.Chains, e.Chain) + + if e.Vault != metadata.Vault { + panic("ahahahaha") + } + } + delegations, err := m.keeper.dualstakingKeeper.GetProviderDelegators(ctx, metadata.Provider) + if err != nil { + panic("ahahahaha") + } + for _, d := range delegations { + if d.Delegator != metadata.Vault { + if metadata.TotalDelegations.Denom == "" { + metadata.TotalDelegations = d.Amount + } else { + metadata.TotalDelegations = metadata.TotalDelegations.Add(d.Amount) + } + } + } + + m.keeper.epochStorageKeeper.SetMetadata(ctx, metadata) + } + return nil +} diff --git a/x/pairing/module.go b/x/pairing/module.go index 17cefe9fe3..8692ed8ade 100644 --- a/x/pairing/module.go +++ b/x/pairing/module.go @@ -137,6 +137,10 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { // if err := cfg.RegisterMigration(types.ModuleName, 3, migrator.MigrateVersion3To4); err != nil { // panic(fmt.Errorf("%s: failed to register migration to v4: %w", types.ModuleName, err)) // } + // register v4 -> v5 migration + if err := cfg.RegisterMigration(types.ModuleName, 4, migrator.MigrateVersion4To5); err != nil { + panic(fmt.Errorf("%s: failed to register migration to v5: %w", types.ModuleName, err)) + } } // RegisterInvariants registers the capability module's invariants. @@ -161,7 +165,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 4 } +func (AppModule) ConsensusVersion() uint64 { return 5 } // BeginBlock executes all ABCI BeginBlock logic respective to the capability module. func (am AppModule) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock) { From 41d089147538d02442f73c56dec82d508b9b8e20 Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Thu, 19 Sep 2024 15:31:43 +0300 Subject: [PATCH 16/27] fix migration --- x/pairing/keeper/migrations.go | 72 +++++++++++++++++++++++++--------- 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/x/pairing/keeper/migrations.go b/x/pairing/keeper/migrations.go index 96d91eaff4..a053ee3760 100644 --- a/x/pairing/keeper/migrations.go +++ b/x/pairing/keeper/migrations.go @@ -1,6 +1,8 @@ package keeper import ( + "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" epochstoragetypes "github.com/lavanet/lava/v3/x/epochstorage/types" v2 "github.com/lavanet/lava/v3/x/pairing/migrations/v2" @@ -24,39 +26,73 @@ func (m Migrator) MigrateVersion2To3(ctx sdk.Context) error { func (m Migrator) MigrateVersion4To5(ctx sdk.Context) error { entries := m.keeper.epochStorageKeeper.GetAllStakeEntriesCurrent(ctx) - providerMap := map[string][]epochstoragetypes.StakeEntry{} + providerMap := map[string][]*epochstoragetypes.StakeEntry{} - for _, e := range entries { - providerMap[e.Address] = append(providerMap[e.Address], e) + // map the providers + for i := range entries { + providerMap[entries[i].Address] = append(providerMap[entries[i].Address], &entries[i]) } - for _, entries := range providerMap { - metadata := epochstoragetypes.ProviderMetadata{} - for i, e := range entries { - if i == 0 { - metadata.Provider = e.Address - metadata.Vault = e.Vault - } - metadata.Chains = append(metadata.Chains, e.Chain) + // iterate over each provider + for address, entries := range providerMap { + metadata := epochstoragetypes.ProviderMetadata{Provider: address} - if e.Vault != metadata.Vault { - panic("ahahahaha") + // find the bigest vault + var biggestVault *epochstoragetypes.StakeEntry + for i := range entries { + e := entries[i] + if e.Vault != e.Address { + if biggestVault == nil { + biggestVault = e + } else { + if biggestVault.Stake.Amount.LT(e.Stake.Amount) { + biggestVault = e + } + } } } + + // if no vault was found the vault is the address + if biggestVault != nil { + metadata.Vault = biggestVault.Vault + } else { + metadata.Vault = address + } + + // get all delegations and sum delegations, err := m.keeper.dualstakingKeeper.GetProviderDelegators(ctx, metadata.Provider) if err != nil { panic("ahahahaha") } + + metadata.TotalDelegations = sdk.NewCoin(m.keeper.stakingKeeper.BondDenom(ctx), sdk.ZeroInt()) for _, d := range delegations { if d.Delegator != metadata.Vault { - if metadata.TotalDelegations.Denom == "" { - metadata.TotalDelegations = d.Amount - } else { - metadata.TotalDelegations = metadata.TotalDelegations.Add(d.Amount) - } + metadata.TotalDelegations = metadata.TotalDelegations.Add(d.Amount) + } + } + + // fix entries with different vaults + // count self delegations + TotalSelfDelegation := sdk.ZeroInt() + for _, e := range entries { + if e.Vault != metadata.Vault { + fmt.Println(address) + biggestVault.Stake = biggestVault.Stake.SubAmount(sdk.NewInt(1)) + e.Stake.Amount = sdk.OneInt() + } else { + TotalSelfDelegation = TotalSelfDelegation.Add(e.Stake.Amount) } } + // calculate delegate total and update the entry + for _, entry := range entries { + metadata.Chains = append(metadata.Chains, entry.Chain) + entry.DelegateTotal = sdk.NewCoin(m.keeper.stakingKeeper.BondDenom(ctx), metadata.TotalDelegations.Amount.Mul(entry.Stake.Amount).Quo(TotalSelfDelegation)) + m.keeper.epochStorageKeeper.SetStakeEntryCurrent(ctx, *entry) + } + + // set the metadata m.keeper.epochStorageKeeper.SetMetadata(ctx, metadata) } return nil From 0573afac8099a184ded92d81cf569c2d71b26ef3 Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Thu, 19 Sep 2024 17:31:01 +0300 Subject: [PATCH 17/27] added metadata query --- .../lava/epochstorage/provider_metadata.proto | 2 +- proto/lavanet/lava/epochstorage/query.proto | 14 + x/epochstorage/client/cli/query.go | 2 + .../client/cli/query_provider_metadata.go | 44 ++ .../keeper/grpc_query_provider_metadata.go | 29 ++ x/epochstorage/types/provider_metadata.pb.go | 42 +- x/epochstorage/types/query.pb.go | 486 ++++++++++++++++-- x/epochstorage/types/query.pb.gw.go | 101 ++++ 8 files changed, 653 insertions(+), 67 deletions(-) create mode 100644 x/epochstorage/client/cli/query_provider_metadata.go create mode 100644 x/epochstorage/keeper/grpc_query_provider_metadata.go diff --git a/proto/lavanet/lava/epochstorage/provider_metadata.proto b/proto/lavanet/lava/epochstorage/provider_metadata.proto index 53ccd58a1f..9201b6c1cb 100644 --- a/proto/lavanet/lava/epochstorage/provider_metadata.proto +++ b/proto/lavanet/lava/epochstorage/provider_metadata.proto @@ -9,6 +9,6 @@ import "amino/amino.proto"; message ProviderMetadata { string provider = 1; string vault = 2; - cosmos.base.v1beta1.Coin TotalDelegations = 3 [(gogoproto.nullable) = false]; + cosmos.base.v1beta1.Coin total_delegations = 3 [(gogoproto.nullable) = false]; repeated string chains = 4; } \ No newline at end of file diff --git a/proto/lavanet/lava/epochstorage/query.proto b/proto/lavanet/lava/epochstorage/query.proto index 402a498fe3..8598ce9ec0 100644 --- a/proto/lavanet/lava/epochstorage/query.proto +++ b/proto/lavanet/lava/epochstorage/query.proto @@ -7,6 +7,7 @@ import "lavanet/lava/epochstorage/params.proto"; import "lavanet/lava/epochstorage/stake_storage.proto"; import "lavanet/lava/epochstorage/epoch_details.proto"; import "lavanet/lava/epochstorage/fixated_params.proto"; +import "lavanet/lava/epochstorage/provider_metadata.proto"; // this line is used by starport scaffolding # 1 import "cosmos/base/v1beta1/coin.proto"; import "gogoproto/gogo.proto"; @@ -44,6 +45,11 @@ service Query { option (google.api.http).get = "/lavanet/lava/epochstorage/fixated_params"; } + // Queries provider metadata. + rpc ProviderMetaData(QueryProviderMetaDataRequest) returns (QueryProviderMetaDataResponse) { + option (google.api.http).get = "/lavanet/lava/epochstorage/provider_metadata/{provider}"; + } + // this line is used by starport scaffolding # 2 } @@ -98,4 +104,12 @@ message QueryAllFixatedParamsResponse { cosmos.base.query.v1beta1.PageResponse pagination = 2; } +message QueryProviderMetaDataRequest { + string provider = 1; +} + +message QueryProviderMetaDataResponse { + repeated ProviderMetadata MetaData = 1 [(gogoproto.nullable) = false]; +} + // this line is used by starport scaffolding # 3 diff --git a/x/epochstorage/client/cli/query.go b/x/epochstorage/client/cli/query.go index decae416ca..1f0b91db88 100644 --- a/x/epochstorage/client/cli/query.go +++ b/x/epochstorage/client/cli/query.go @@ -30,6 +30,8 @@ func GetQueryCmd(queryRoute string) *cobra.Command { cmd.AddCommand(CmdShowEpochDetails()) cmd.AddCommand(CmdListFixatedParams()) cmd.AddCommand(CmdShowFixatedParams()) + cmd.AddCommand(CmdProviderMetadata()) + // this line is used by starport scaffolding # 1 return cmd diff --git a/x/epochstorage/client/cli/query_provider_metadata.go b/x/epochstorage/client/cli/query_provider_metadata.go new file mode 100644 index 0000000000..cf2a7bb355 --- /dev/null +++ b/x/epochstorage/client/cli/query_provider_metadata.go @@ -0,0 +1,44 @@ +package cli + +import ( + "context" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/lavanet/lava/v3/x/epochstorage/types" + "github.com/spf13/cobra" +) + +func CmdProviderMetadata() *cobra.Command { + cmd := &cobra.Command{ + Use: "provider-metadata", + Short: "returns the metadata for the provider address, if empty returns the metadata of all providers", + Example: "lavad provider-metadata lava@12345", + Args: cobra.RangeArgs(0, 1), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + provider := "" + if len(args) == 1 { + provider = args[0] + } + + res, err := queryClient.ProviderMetaData(context.Background(), &types.QueryProviderMetaDataRequest{Provider: provider}) + if err != nil { + return err + } + + return clientCtx.PrintProto(res) + }, + } + + flags.AddPaginationFlagsToCmd(cmd, cmd.Use) + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/epochstorage/keeper/grpc_query_provider_metadata.go b/x/epochstorage/keeper/grpc_query_provider_metadata.go new file mode 100644 index 0000000000..5587c2e2b9 --- /dev/null +++ b/x/epochstorage/keeper/grpc_query_provider_metadata.go @@ -0,0 +1,29 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/lavanet/lava/v3/x/epochstorage/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) ProviderMetaData(c context.Context, req *types.QueryProviderMetaDataRequest) (*types.QueryProviderMetaDataResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(c) + var err error + res := types.QueryProviderMetaDataResponse{} + if req.Provider == "" { + res.MetaData, err = k.GetAllMetadata(ctx) + } else { + var metadata types.ProviderMetadata + metadata, err = k.GetMetadata(ctx, req.Provider) + res.MetaData = append(res.MetaData, metadata) + } + + return &res, err +} diff --git a/x/epochstorage/types/provider_metadata.pb.go b/x/epochstorage/types/provider_metadata.pb.go index 2dac9ff57b..a4e607706a 100644 --- a/x/epochstorage/types/provider_metadata.pb.go +++ b/x/epochstorage/types/provider_metadata.pb.go @@ -28,7 +28,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type ProviderMetadata struct { Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` Vault string `protobuf:"bytes,2,opt,name=vault,proto3" json:"vault,omitempty"` - TotalDelegations types.Coin `protobuf:"bytes,3,opt,name=TotalDelegations,proto3" json:"TotalDelegations"` + TotalDelegations types.Coin `protobuf:"bytes,3,opt,name=total_delegations,json=totalDelegations,proto3" json:"total_delegations"` Chains []string `protobuf:"bytes,4,rep,name=chains,proto3" json:"chains,omitempty"` } @@ -102,26 +102,26 @@ func init() { } var fileDescriptor_eea88d8dbfad23fd = []byte{ - // 298 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0xb1, 0x4e, 0xc3, 0x30, - 0x10, 0x86, 0x63, 0x5a, 0x2a, 0x6a, 0x96, 0x12, 0x55, 0x28, 0xed, 0x60, 0x2a, 0xa6, 0x4e, 0xb6, - 0x4a, 0xdf, 0xa0, 0xb0, 0x20, 0x84, 0x84, 0x2a, 0x26, 0x16, 0x74, 0x49, 0xad, 0xc4, 0x52, 0xe2, - 0x8b, 0x62, 0x37, 0x82, 0xb7, 0xe0, 0x35, 0x78, 0x93, 0x8e, 0x1d, 0x99, 0x10, 0x4a, 0x5e, 0x04, - 0x25, 0x31, 0x88, 0x8a, 0xc5, 0xe7, 0xdf, 0xe7, 0x5f, 0xf7, 0xdd, 0x4f, 0x17, 0x29, 0x94, 0xa0, - 0xa5, 0x15, 0x4d, 0x15, 0x32, 0xc7, 0x28, 0x31, 0x16, 0x0b, 0x88, 0xa5, 0xc8, 0x0b, 0x2c, 0xd5, - 0x46, 0x16, 0xcf, 0x99, 0xb4, 0xb0, 0x01, 0x0b, 0x3c, 0x2f, 0xd0, 0xa2, 0x3f, 0x71, 0x16, 0xde, - 0x54, 0xfe, 0xd7, 0x32, 0x1d, 0xc7, 0x18, 0x63, 0xfb, 0x4b, 0x34, 0xb7, 0xce, 0x30, 0x65, 0x11, - 0x9a, 0x0c, 0x8d, 0x08, 0xc1, 0x48, 0x51, 0x2e, 0x42, 0x69, 0x61, 0x21, 0x22, 0x54, 0xda, 0xf5, - 0xcf, 0x20, 0x53, 0x1a, 0x45, 0x7b, 0x76, 0x4f, 0x97, 0xef, 0x84, 0x8e, 0x1e, 0xdc, 0xfc, 0x7b, - 0x37, 0xde, 0x9f, 0xd2, 0x93, 0x1f, 0xa6, 0x80, 0xcc, 0xc8, 0x7c, 0xb8, 0xfe, 0xd5, 0xfe, 0x98, - 0x1e, 0x97, 0xb0, 0x4d, 0x6d, 0x70, 0xd4, 0x36, 0x3a, 0xe1, 0xdf, 0xd1, 0xd1, 0x23, 0x5a, 0x48, - 0x6f, 0x64, 0x2a, 0x63, 0xb0, 0x0a, 0xb5, 0x09, 0x7a, 0x33, 0x32, 0x3f, 0xbd, 0x9a, 0xf0, 0x0e, - 0x8a, 0x37, 0x50, 0xdc, 0x41, 0xf1, 0x6b, 0x54, 0x7a, 0xd5, 0xdf, 0x7d, 0x5e, 0x78, 0xeb, 0x7f, - 0x46, 0xff, 0x9c, 0x0e, 0xa2, 0x04, 0x94, 0x36, 0x41, 0x7f, 0xd6, 0x9b, 0x0f, 0xd7, 0x4e, 0xad, - 0x6e, 0x77, 0x15, 0x23, 0xfb, 0x8a, 0x91, 0xaf, 0x8a, 0x91, 0xb7, 0x9a, 0x79, 0xfb, 0x9a, 0x79, - 0x1f, 0x35, 0xf3, 0x9e, 0x44, 0xac, 0x6c, 0xb2, 0x0d, 0x79, 0x84, 0x99, 0x38, 0xc8, 0xb9, 0x5c, - 0x8a, 0x97, 0xc3, 0xb0, 0xed, 0x6b, 0x2e, 0x4d, 0x38, 0x68, 0xb7, 0x5f, 0x7e, 0x07, 0x00, 0x00, - 0xff, 0xff, 0x2f, 0x07, 0x8d, 0xb1, 0x96, 0x01, 0x00, 0x00, + // 302 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x90, 0x4f, 0x6e, 0xf2, 0x30, + 0x10, 0xc5, 0xe3, 0x0f, 0x3e, 0x54, 0xd2, 0x0d, 0x44, 0xa8, 0x0a, 0x2c, 0x5c, 0xd4, 0x15, 0x2b, + 0x5b, 0x94, 0x1b, 0xd0, 0x6e, 0x2a, 0xb5, 0x52, 0xc5, 0xb2, 0x1b, 0x34, 0x09, 0x56, 0xb0, 0x94, + 0x78, 0xa2, 0x78, 0x88, 0xda, 0x5b, 0xf4, 0x1c, 0x3d, 0x09, 0x4b, 0x96, 0x5d, 0x55, 0x15, 0xb9, + 0x48, 0x95, 0xc4, 0xfd, 0xc3, 0xc6, 0xe3, 0xe7, 0xf1, 0x4f, 0xf3, 0xe6, 0xf9, 0xf3, 0x14, 0x4a, + 0x30, 0x8a, 0x64, 0x5d, 0xa5, 0xca, 0x31, 0xde, 0x5a, 0xc2, 0x02, 0x12, 0x25, 0xf3, 0x02, 0x4b, + 0xbd, 0x51, 0xc5, 0x3a, 0x53, 0x04, 0x1b, 0x20, 0x10, 0x79, 0x81, 0x84, 0xc1, 0xd8, 0x21, 0xa2, + 0xae, 0xe2, 0x2f, 0x32, 0x19, 0x25, 0x98, 0x60, 0xf3, 0x4b, 0xd6, 0xb7, 0x16, 0x98, 0xf0, 0x18, + 0x6d, 0x86, 0x56, 0x46, 0x60, 0x95, 0x2c, 0xe7, 0x91, 0x22, 0x98, 0xcb, 0x18, 0xb5, 0x71, 0xfd, + 0x21, 0x64, 0xda, 0xa0, 0x6c, 0xce, 0xf6, 0xe9, 0xea, 0x8d, 0xf9, 0x83, 0x47, 0x37, 0xff, 0xc1, + 0x8d, 0x0f, 0x26, 0xfe, 0xd9, 0xb7, 0xa7, 0x90, 0x4d, 0xd9, 0xac, 0xbf, 0xfa, 0xd1, 0xc1, 0xc8, + 0xff, 0x5f, 0xc2, 0x2e, 0xa5, 0xf0, 0x5f, 0xd3, 0x68, 0x45, 0x70, 0xef, 0x0f, 0x09, 0x09, 0xd2, + 0xf5, 0x46, 0xa5, 0x2a, 0x01, 0xd2, 0x68, 0x6c, 0xd8, 0x99, 0xb2, 0xd9, 0xf9, 0xf5, 0x58, 0xb4, + 0xae, 0x44, 0xed, 0x4a, 0x38, 0x57, 0xe2, 0x06, 0xb5, 0x59, 0x76, 0xf7, 0x1f, 0x97, 0xde, 0x6a, + 0xd0, 0x90, 0xb7, 0xbf, 0x60, 0x70, 0xe1, 0xf7, 0xe2, 0x2d, 0x68, 0x63, 0xc3, 0xee, 0xb4, 0x33, + 0xeb, 0xaf, 0x9c, 0x5a, 0xde, 0xed, 0x8f, 0x9c, 0x1d, 0x8e, 0x9c, 0x7d, 0x1e, 0x39, 0x7b, 0xad, + 0xb8, 0x77, 0xa8, 0xb8, 0xf7, 0x5e, 0x71, 0xef, 0x49, 0x26, 0x9a, 0xb6, 0xbb, 0x48, 0xc4, 0x98, + 0xc9, 0x93, 0xa0, 0xcb, 0x85, 0x7c, 0x3e, 0x4d, 0x9b, 0x5e, 0x72, 0x65, 0xa3, 0x5e, 0xb3, 0xfe, + 0xe2, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x61, 0xaf, 0xaa, 0xf8, 0x97, 0x01, 0x00, 0x00, } func (m *ProviderMetadata) Marshal() (dAtA []byte, err error) { diff --git a/x/epochstorage/types/query.pb.go b/x/epochstorage/types/query.pb.go index 64e754ca79..2247632086 100644 --- a/x/epochstorage/types/query.pb.go +++ b/x/epochstorage/types/query.pb.go @@ -562,6 +562,94 @@ func (m *QueryAllFixatedParamsResponse) GetPagination() *query.PageResponse { return nil } +type QueryProviderMetaDataRequest struct { + Provider string `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"` +} + +func (m *QueryProviderMetaDataRequest) Reset() { *m = QueryProviderMetaDataRequest{} } +func (m *QueryProviderMetaDataRequest) String() string { return proto.CompactTextString(m) } +func (*QueryProviderMetaDataRequest) ProtoMessage() {} +func (*QueryProviderMetaDataRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_60112e15fc266719, []int{12} +} +func (m *QueryProviderMetaDataRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryProviderMetaDataRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryProviderMetaDataRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryProviderMetaDataRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryProviderMetaDataRequest.Merge(m, src) +} +func (m *QueryProviderMetaDataRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryProviderMetaDataRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryProviderMetaDataRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryProviderMetaDataRequest proto.InternalMessageInfo + +func (m *QueryProviderMetaDataRequest) GetProvider() string { + if m != nil { + return m.Provider + } + return "" +} + +type QueryProviderMetaDataResponse struct { + MetaData []ProviderMetadata `protobuf:"bytes,1,rep,name=MetaData,proto3" json:"MetaData"` +} + +func (m *QueryProviderMetaDataResponse) Reset() { *m = QueryProviderMetaDataResponse{} } +func (m *QueryProviderMetaDataResponse) String() string { return proto.CompactTextString(m) } +func (*QueryProviderMetaDataResponse) ProtoMessage() {} +func (*QueryProviderMetaDataResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_60112e15fc266719, []int{13} +} +func (m *QueryProviderMetaDataResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryProviderMetaDataResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryProviderMetaDataResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryProviderMetaDataResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryProviderMetaDataResponse.Merge(m, src) +} +func (m *QueryProviderMetaDataResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryProviderMetaDataResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryProviderMetaDataResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryProviderMetaDataResponse proto.InternalMessageInfo + +func (m *QueryProviderMetaDataResponse) GetMetaData() []ProviderMetadata { + if m != nil { + return m.MetaData + } + return nil +} + func init() { proto.RegisterType((*QueryParamsRequest)(nil), "lavanet.lava.epochstorage.QueryParamsRequest") proto.RegisterType((*QueryParamsResponse)(nil), "lavanet.lava.epochstorage.QueryParamsResponse") @@ -575,6 +663,8 @@ func init() { proto.RegisterType((*QueryGetFixatedParamsResponse)(nil), "lavanet.lava.epochstorage.QueryGetFixatedParamsResponse") proto.RegisterType((*QueryAllFixatedParamsRequest)(nil), "lavanet.lava.epochstorage.QueryAllFixatedParamsRequest") proto.RegisterType((*QueryAllFixatedParamsResponse)(nil), "lavanet.lava.epochstorage.QueryAllFixatedParamsResponse") + proto.RegisterType((*QueryProviderMetaDataRequest)(nil), "lavanet.lava.epochstorage.QueryProviderMetaDataRequest") + proto.RegisterType((*QueryProviderMetaDataResponse)(nil), "lavanet.lava.epochstorage.QueryProviderMetaDataResponse") } func init() { @@ -582,51 +672,58 @@ func init() { } var fileDescriptor_60112e15fc266719 = []byte{ - // 703 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0x41, 0x4f, 0xd4, 0x40, - 0x14, 0xc7, 0x77, 0x40, 0x88, 0x8e, 0x10, 0xcd, 0xc8, 0x41, 0x57, 0xa8, 0x52, 0x23, 0x02, 0x86, - 0x19, 0x96, 0x35, 0x8a, 0x27, 0x03, 0x51, 0x88, 0x37, 0x58, 0x8c, 0x07, 0x2f, 0x64, 0x76, 0x19, - 0x4a, 0x63, 0xe9, 0x94, 0xed, 0x2c, 0x81, 0x18, 0x2f, 0x7e, 0x02, 0xa3, 0x9f, 0xc4, 0xc4, 0x83, - 0x9a, 0xc8, 0x99, 0x23, 0x89, 0x17, 0x4f, 0xc6, 0x80, 0x1f, 0xc4, 0x74, 0x66, 0xd6, 0xce, 0x84, - 0x96, 0x16, 0xe1, 0xb4, 0xdb, 0xe9, 0x7b, 0xff, 0xf7, 0xfb, 0xcf, 0xbc, 0xbe, 0x16, 0xde, 0x0d, - 0xe8, 0x36, 0x0d, 0x99, 0x20, 0xc9, 0x2f, 0x61, 0x11, 0x6f, 0x6d, 0xc4, 0x82, 0xb7, 0xa9, 0xc7, - 0xc8, 0x56, 0x87, 0xb5, 0x77, 0x71, 0xd4, 0xe6, 0x82, 0xa3, 0x1b, 0x3a, 0x0c, 0x27, 0xbf, 0xd8, - 0x0c, 0xab, 0x0e, 0x7b, 0x9c, 0x7b, 0x01, 0x23, 0x34, 0xf2, 0x09, 0x0d, 0x43, 0x2e, 0xa8, 0xf0, - 0x79, 0x18, 0xab, 0xc4, 0xea, 0x64, 0x8b, 0xc7, 0x9b, 0x3c, 0x26, 0x4d, 0x1a, 0x6b, 0x45, 0xb2, - 0x5d, 0x6b, 0x32, 0x41, 0x6b, 0x24, 0xa2, 0x9e, 0x1f, 0xca, 0x60, 0x1d, 0x3b, 0x96, 0xcf, 0x12, - 0xd1, 0x36, 0xdd, 0xec, 0x6a, 0x4e, 0xe5, 0xc7, 0xc5, 0x82, 0xbe, 0x66, 0xab, 0xfa, 0xaa, 0x38, - 0x5c, 0x5e, 0xac, 0xae, 0x31, 0x41, 0xfd, 0xa0, 0xab, 0x8e, 0xf3, 0xc3, 0xd7, 0xfd, 0x1d, 0x2a, - 0xd8, 0xda, 0xaa, 0x45, 0xe3, 0x98, 0x0e, 0xbb, 0xde, 0x5a, 0xdc, 0xef, 0xba, 0x1a, 0xf2, 0xb8, - 0xc7, 0xe5, 0x5f, 0x92, 0xfc, 0x53, 0xab, 0xee, 0x10, 0x44, 0xcb, 0xc9, 0x6e, 0x2c, 0x49, 0xa9, - 0x06, 0xdb, 0xea, 0xb0, 0x58, 0xb8, 0x2f, 0xe1, 0x35, 0x6b, 0x35, 0x8e, 0x78, 0x18, 0x33, 0xf4, - 0x04, 0xf6, 0xab, 0x92, 0xd7, 0xc1, 0x6d, 0x30, 0x7e, 0x79, 0x66, 0x14, 0xe7, 0x1e, 0x07, 0x56, - 0xa9, 0xf3, 0x17, 0xf6, 0x7f, 0xdd, 0xaa, 0x34, 0x74, 0x9a, 0x5b, 0x87, 0x37, 0xa5, 0xee, 0x22, - 0x13, 0x2b, 0xc9, 0x0e, 0xad, 0xa8, 0x60, 0x5d, 0x16, 0x0d, 0xc1, 0x3e, 0x3f, 0x5c, 0x63, 0x3b, - 0x52, 0xfe, 0x52, 0x43, 0x5d, 0xb8, 0x5b, 0x70, 0x38, 0x3b, 0x49, 0x53, 0x2d, 0xc3, 0x81, 0xd8, - 0x58, 0xd7, 0x6c, 0xf7, 0x4e, 0x60, 0x33, 0x65, 0x34, 0xa1, 0x25, 0xe1, 0x32, 0xcd, 0x39, 0x17, - 0x04, 0x59, 0x9c, 0x0b, 0x10, 0xa6, 0x4d, 0xa3, 0xeb, 0x8d, 0x61, 0xb5, 0xff, 0x38, 0xd9, 0x7f, - 0xac, 0x7a, 0x56, 0x9f, 0x02, 0x5e, 0x4a, 0x73, 0x1b, 0x46, 0xa6, 0xfb, 0x0d, 0x68, 0x6b, 0xc7, - 0xea, 0xe4, 0x5a, 0xeb, 0x3d, 0xa3, 0x35, 0xb4, 0x68, 0xb1, 0xf7, 0xe8, 0xbd, 0x2a, 0x62, 0x57, - 0x3c, 0x16, 0xfc, 0x48, 0x7a, 0x96, 0xcf, 0x12, 0x82, 0xa7, 0xaa, 0x7b, 0xbb, 0x2d, 0x64, 0x9c, - 0x9a, 0x7d, 0x3b, 0xb5, 0x66, 0xae, 0x97, 0x38, 0x35, 0x33, 0xbc, 0x6b, 0xcd, 0x5c, 0x73, 0x1f, - 0xa4, 0x25, 0x17, 0xd4, 0x13, 0x62, 0x75, 0x75, 0x4e, 0x7b, 0x75, 0xe0, 0x48, 0x4e, 0x96, 0x26, - 0x7d, 0x01, 0x07, 0xd7, 0xcd, 0x1b, 0x1a, 0x75, 0xfc, 0x04, 0x54, 0x4b, 0x48, 0xb3, 0xda, 0x22, - 0xee, 0x7a, 0x7a, 0xf4, 0x99, 0xb0, 0xe7, 0xd5, 0x63, 0x7b, 0x40, 0xfb, 0x3b, 0x5e, 0x28, 0xdf, - 0x5f, 0xef, 0x99, 0xfd, 0x9d, 0x5b, 0x9f, 0xcd, 0xec, 0x5d, 0x84, 0x7d, 0xd2, 0x00, 0xfa, 0x00, - 0x60, 0xbf, 0x56, 0x9f, 0x3a, 0x01, 0xee, 0xf8, 0x3c, 0xab, 0xe2, 0xb2, 0xe1, 0xaa, 0xbe, 0x3b, - 0xf1, 0xee, 0xc7, 0x9f, 0x8f, 0x3d, 0x77, 0xd0, 0x28, 0x29, 0x7a, 0x15, 0xa0, 0xaf, 0x00, 0x0e, - 0x98, 0x0f, 0x1d, 0x7a, 0x58, 0x54, 0x2b, 0x7b, 0xf8, 0x55, 0x1f, 0x9d, 0x3a, 0x4f, 0xc3, 0xce, - 0x4a, 0xd8, 0x19, 0x34, 0x4d, 0x4a, 0xbe, 0x8f, 0xc8, 0x1b, 0xd9, 0xf9, 0x6f, 0xd1, 0x67, 0x00, - 0xaf, 0x98, 0x92, 0x73, 0x41, 0x50, 0x8c, 0x9f, 0x3d, 0x13, 0x8b, 0xf1, 0x73, 0x66, 0x9c, 0x3b, - 0x2d, 0xf1, 0x27, 0xd1, 0x78, 0x59, 0x7c, 0xf4, 0x09, 0xd8, 0xb3, 0xa3, 0xd4, 0x96, 0x67, 0xcc, - 0xa8, 0x52, 0x5b, 0x9e, 0x35, 0xbc, 0x4a, 0x31, 0x5b, 0xef, 0x74, 0xf4, 0x1d, 0xc0, 0x41, 0xeb, - 0xa9, 0x41, 0x65, 0x8a, 0x67, 0x4d, 0x86, 0xea, 0xec, 0xe9, 0x13, 0x35, 0xf6, 0x63, 0x89, 0x5d, - 0x47, 0x35, 0x52, 0xf6, 0xdb, 0xe2, 0x5f, 0xab, 0x7c, 0x01, 0xf0, 0xaa, 0x25, 0x9a, 0xf4, 0x4a, - 0x99, 0x33, 0xff, 0x3f, 0x0b, 0x79, 0xc3, 0xca, 0xad, 0x49, 0x0b, 0xf7, 0xd1, 0x44, 0x69, 0x0b, - 0xf3, 0xcf, 0xf7, 0x0f, 0x1d, 0x70, 0x70, 0xe8, 0x80, 0xdf, 0x87, 0x0e, 0x78, 0x7f, 0xe4, 0x54, - 0x0e, 0x8e, 0x9c, 0xca, 0xcf, 0x23, 0xa7, 0xf2, 0x8a, 0x78, 0xbe, 0xd8, 0xe8, 0x34, 0x71, 0x8b, - 0x6f, 0xda, 0x72, 0xdb, 0x75, 0xb2, 0x63, 0x6b, 0x8a, 0xdd, 0x88, 0xc5, 0xcd, 0x7e, 0xf9, 0xd1, - 0x54, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xdb, 0x27, 0x7e, 0x6a, 0xae, 0x0a, 0x00, 0x00, + // 807 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0xcd, 0x4f, 0x13, 0x4d, + 0x1c, 0xc7, 0x3b, 0xf0, 0x40, 0x78, 0xe6, 0x81, 0x3c, 0x64, 0x1e, 0x0e, 0x8f, 0x15, 0xaa, 0xac, + 0x11, 0x79, 0x09, 0x3b, 0x94, 0x1a, 0x01, 0x2f, 0x04, 0x82, 0x10, 0x0f, 0x24, 0x50, 0x8c, 0x07, + 0x2f, 0xcd, 0xb4, 0x1d, 0xca, 0xc6, 0x76, 0xa7, 0x74, 0xa7, 0x0d, 0x84, 0x70, 0xf1, 0xe2, 0xd5, + 0xe8, 0x5f, 0x62, 0xe2, 0x41, 0x4d, 0xf4, 0x68, 0x38, 0x92, 0x78, 0xf1, 0x64, 0x0c, 0xf8, 0x87, + 0x98, 0x9d, 0xfd, 0x2d, 0xdd, 0xb1, 0xbb, 0xdd, 0x45, 0x38, 0xb5, 0x3b, 0xfd, 0xbd, 0x7c, 0x7e, + 0x2f, 0xfb, 0xed, 0xe0, 0xbb, 0x55, 0xd6, 0x62, 0x36, 0x97, 0xd4, 0xfd, 0xa4, 0xbc, 0x2e, 0x4a, + 0x7b, 0x8e, 0x14, 0x0d, 0x56, 0xe1, 0x74, 0xbf, 0xc9, 0x1b, 0x87, 0x66, 0xbd, 0x21, 0xa4, 0x20, + 0x37, 0xc0, 0xcc, 0x74, 0x3f, 0xcd, 0xa0, 0x59, 0x7a, 0xb4, 0x22, 0x44, 0xa5, 0xca, 0x29, 0xab, + 0x5b, 0x94, 0xd9, 0xb6, 0x90, 0x4c, 0x5a, 0xc2, 0x76, 0x3c, 0xc7, 0xf4, 0x74, 0x49, 0x38, 0x35, + 0xe1, 0xd0, 0x22, 0x73, 0x20, 0x22, 0x6d, 0x65, 0x8b, 0x5c, 0xb2, 0x2c, 0xad, 0xb3, 0x8a, 0x65, + 0x2b, 0x63, 0xb0, 0x9d, 0x88, 0x66, 0xa9, 0xb3, 0x06, 0xab, 0xf9, 0x31, 0x67, 0xa3, 0xed, 0x1c, + 0xc9, 0x9e, 0xf3, 0x02, 0x3c, 0xc5, 0x9b, 0xab, 0x87, 0x42, 0x99, 0x4b, 0x66, 0x55, 0xfd, 0xe8, + 0x66, 0xb4, 0xf9, 0xae, 0x75, 0xc0, 0x24, 0x2f, 0x17, 0x34, 0x9a, 0x6c, 0x17, 0xea, 0x86, 0x68, + 0x59, 0x65, 0xde, 0x28, 0xd4, 0xb8, 0x64, 0x65, 0x26, 0x19, 0xb8, 0x64, 0x82, 0x4d, 0xf1, 0xdb, + 0x51, 0x12, 0x96, 0xdf, 0x88, 0x91, 0x8a, 0xa8, 0x08, 0xf5, 0x95, 0xba, 0xdf, 0xbc, 0x53, 0x63, + 0x04, 0x93, 0x6d, 0xb7, 0x81, 0x5b, 0x2a, 0x7b, 0x9e, 0xef, 0x37, 0xb9, 0x23, 0x8d, 0xa7, 0xf8, + 0x3f, 0xed, 0xd4, 0xa9, 0x0b, 0xdb, 0xe1, 0x64, 0x19, 0xf7, 0x7b, 0x94, 0xff, 0xa3, 0xdb, 0x68, + 0xf2, 0x9f, 0xf9, 0x71, 0x33, 0x72, 0x82, 0xa6, 0xe7, 0xba, 0xfa, 0xd7, 0xc9, 0xf7, 0x5b, 0xa9, + 0x3c, 0xb8, 0x19, 0x39, 0x7c, 0x53, 0xc5, 0xdd, 0xe0, 0x72, 0xc7, 0x6d, 0xea, 0x8e, 0x67, 0x0c, + 0x69, 0xc9, 0x08, 0xee, 0xb3, 0xec, 0x32, 0x3f, 0x50, 0xe1, 0xff, 0xce, 0x7b, 0x0f, 0xc6, 0x3e, + 0x1e, 0x0d, 0x77, 0x02, 0xaa, 0x6d, 0x3c, 0xe8, 0x04, 0xce, 0x81, 0xed, 0x5e, 0x17, 0xb6, 0x60, + 0x18, 0x20, 0xd4, 0x42, 0x18, 0x1c, 0x38, 0x57, 0xaa, 0xd5, 0x30, 0xce, 0x75, 0x8c, 0xdb, 0x7b, + 0x06, 0xf9, 0x26, 0x4c, 0xaf, 0xff, 0xa6, 0xdb, 0x7f, 0xd3, 0x5b, 0x73, 0x98, 0x82, 0xb9, 0xd5, + 0xf6, 0xcd, 0x07, 0x3c, 0x8d, 0x8f, 0x08, 0x4a, 0xeb, 0xc8, 0x13, 0x59, 0x5a, 0xef, 0x15, 0x4b, + 0x23, 0x1b, 0x1a, 0x7b, 0x0f, 0xf4, 0x2a, 0x8e, 0xdd, 0xe3, 0xd1, 0xe0, 0xc7, 0xda, 0xb3, 0x7c, + 0xe4, 0x12, 0xac, 0x79, 0x0b, 0xef, 0xaf, 0x50, 0x60, 0x6a, 0xfa, 0xcf, 0xed, 0xd2, 0x82, 0xe7, + 0x09, 0xa6, 0x16, 0x34, 0xf7, 0x4b, 0x0b, 0x9e, 0x19, 0xf7, 0xdb, 0x29, 0xd7, 0xbd, 0x97, 0x4a, + 0xdb, 0xea, 0x88, 0xf5, 0x6a, 0xe2, 0xb1, 0x08, 0x2f, 0x20, 0x7d, 0x82, 0x87, 0x76, 0x83, 0x3f, + 0x00, 0xea, 0x64, 0x17, 0x54, 0x2d, 0x10, 0xb0, 0xea, 0x41, 0x8c, 0xdd, 0xf6, 0xe8, 0x43, 0x61, + 0xaf, 0x6b, 0xc7, 0x3e, 0x23, 0xa8, 0xaf, 0x33, 0x51, 0x74, 0x7d, 0xbd, 0x57, 0xae, 0xef, 0xfa, + 0xf6, 0xec, 0x21, 0x34, 0x6a, 0x0b, 0x74, 0x6f, 0x93, 0x4b, 0xb6, 0xc6, 0x24, 0xf3, 0x1b, 0x95, + 0xc6, 0x03, 0xbe, 0x24, 0xc2, 0x60, 0x2f, 0x9e, 0x0d, 0x1b, 0x6a, 0xef, 0xf4, 0x85, 0xda, 0x37, + 0xf1, 0x80, 0x7f, 0x06, 0x65, 0xcf, 0x74, 0xd3, 0xb4, 0x40, 0x18, 0x57, 0x79, 0xa1, 0xf2, 0x8b, + 0x10, 0xf3, 0x2f, 0x31, 0xee, 0x53, 0x09, 0xc9, 0x6b, 0x84, 0xfb, 0xa1, 0x13, 0xb3, 0x5d, 0x22, + 0x76, 0x6a, 0x6f, 0xda, 0x4c, 0x6a, 0xee, 0x95, 0x60, 0x4c, 0xbd, 0xf8, 0xfa, 0xf3, 0x4d, 0xcf, + 0x1d, 0x32, 0x4e, 0xe3, 0xfe, 0xe9, 0xc8, 0x07, 0x84, 0x07, 0x83, 0x02, 0x41, 0x1e, 0xc4, 0xe5, + 0x0a, 0x17, 0xea, 0xf4, 0xc2, 0xa5, 0xfd, 0x00, 0x76, 0x51, 0xc1, 0xce, 0x93, 0x39, 0x9a, 0xf0, + 0xef, 0x96, 0x1e, 0xa9, 0xb7, 0xf4, 0x98, 0xbc, 0x43, 0xf8, 0xdf, 0x60, 0xc8, 0x95, 0x6a, 0x35, + 0x1e, 0x3f, 0x5c, 0xbf, 0xe3, 0xf1, 0x23, 0xf4, 0xd8, 0x98, 0x53, 0xf8, 0xd3, 0x64, 0x32, 0x29, + 0x3e, 0x79, 0x8b, 0x74, 0x9d, 0x4b, 0xd4, 0xf2, 0x10, 0x3d, 0x4d, 0xd4, 0xf2, 0x30, 0xa1, 0x4d, + 0xc4, 0xac, 0x5d, 0x59, 0xc8, 0x27, 0x84, 0x87, 0xb4, 0x37, 0x9c, 0x24, 0x49, 0x1e, 0xa6, 0x62, + 0xe9, 0xc5, 0xcb, 0x3b, 0x02, 0xf6, 0x92, 0xc2, 0xce, 0x91, 0x2c, 0x4d, 0x7a, 0x75, 0xba, 0x58, + 0x95, 0xf7, 0x08, 0x0f, 0x6b, 0x41, 0xdd, 0x5d, 0x49, 0x32, 0xf3, 0x3f, 0x2b, 0x21, 0x4a, 0x58, + 0x8d, 0xac, 0x2a, 0x61, 0x86, 0x4c, 0x25, 0x2e, 0x81, 0x7c, 0x41, 0x78, 0xf8, 0x77, 0xb1, 0x8a, + 0x47, 0x8f, 0x90, 0xc6, 0x78, 0xf4, 0x28, 0x5d, 0x34, 0x96, 0x15, 0xfa, 0x12, 0x59, 0xa0, 0x97, + 0xb8, 0x88, 0xd2, 0x23, 0xff, 0xe8, 0x78, 0xf5, 0xf1, 0xc9, 0x59, 0x06, 0x9d, 0x9e, 0x65, 0xd0, + 0x8f, 0xb3, 0x0c, 0x7a, 0x75, 0x9e, 0x49, 0x9d, 0x9e, 0x67, 0x52, 0xdf, 0xce, 0x33, 0xa9, 0x67, + 0xb4, 0x62, 0xc9, 0xbd, 0x66, 0xd1, 0x2c, 0x89, 0x9a, 0x1e, 0xbc, 0x95, 0xa3, 0x07, 0x7a, 0x06, + 0x79, 0x58, 0xe7, 0x4e, 0xb1, 0x5f, 0xdd, 0x54, 0x73, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xdb, + 0xdb, 0xbf, 0x35, 0x56, 0x0c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -653,6 +750,8 @@ type QueryClient interface { FixatedParams(ctx context.Context, in *QueryGetFixatedParamsRequest, opts ...grpc.CallOption) (*QueryGetFixatedParamsResponse, error) // Queries a list of FixatedParams items. FixatedParamsAll(ctx context.Context, in *QueryAllFixatedParamsRequest, opts ...grpc.CallOption) (*QueryAllFixatedParamsResponse, error) + // Queries provider metadata. + ProviderMetaData(ctx context.Context, in *QueryProviderMetaDataRequest, opts ...grpc.CallOption) (*QueryProviderMetaDataResponse, error) } type queryClient struct { @@ -717,6 +816,15 @@ func (c *queryClient) FixatedParamsAll(ctx context.Context, in *QueryAllFixatedP return out, nil } +func (c *queryClient) ProviderMetaData(ctx context.Context, in *QueryProviderMetaDataRequest, opts ...grpc.CallOption) (*QueryProviderMetaDataResponse, error) { + out := new(QueryProviderMetaDataResponse) + err := c.cc.Invoke(ctx, "/lavanet.lava.epochstorage.Query/ProviderMetaData", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { // Parameters queries the parameters of the module. @@ -731,6 +839,8 @@ type QueryServer interface { FixatedParams(context.Context, *QueryGetFixatedParamsRequest) (*QueryGetFixatedParamsResponse, error) // Queries a list of FixatedParams items. FixatedParamsAll(context.Context, *QueryAllFixatedParamsRequest) (*QueryAllFixatedParamsResponse, error) + // Queries provider metadata. + ProviderMetaData(context.Context, *QueryProviderMetaDataRequest) (*QueryProviderMetaDataResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -755,6 +865,9 @@ func (*UnimplementedQueryServer) FixatedParams(ctx context.Context, req *QueryGe func (*UnimplementedQueryServer) FixatedParamsAll(ctx context.Context, req *QueryAllFixatedParamsRequest) (*QueryAllFixatedParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method FixatedParamsAll not implemented") } +func (*UnimplementedQueryServer) ProviderMetaData(ctx context.Context, req *QueryProviderMetaDataRequest) (*QueryProviderMetaDataResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ProviderMetaData not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -868,6 +981,24 @@ func _Query_FixatedParamsAll_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _Query_ProviderMetaData_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryProviderMetaDataRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).ProviderMetaData(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/lavanet.lava.epochstorage.Query/ProviderMetaData", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).ProviderMetaData(ctx, req.(*QueryProviderMetaDataRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "lavanet.lava.epochstorage.Query", HandlerType: (*QueryServer)(nil), @@ -896,6 +1027,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "FixatedParamsAll", Handler: _Query_FixatedParamsAll_Handler, }, + { + MethodName: "ProviderMetaData", + Handler: _Query_ProviderMetaData_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "lavanet/lava/epochstorage/query.proto", @@ -1307,6 +1442,73 @@ func (m *QueryAllFixatedParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } +func (m *QueryProviderMetaDataRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryProviderMetaDataRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryProviderMetaDataRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Provider) > 0 { + i -= len(m.Provider) + copy(dAtA[i:], m.Provider) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Provider))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryProviderMetaDataResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryProviderMetaDataResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryProviderMetaDataResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.MetaData) > 0 { + for iNdEx := len(m.MetaData) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.MetaData[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -1470,6 +1672,34 @@ func (m *QueryAllFixatedParamsResponse) Size() (n int) { return n } +func (m *QueryProviderMetaDataRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Provider) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryProviderMetaDataResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.MetaData) > 0 { + for _, e := range m.MetaData { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2484,6 +2714,172 @@ func (m *QueryAllFixatedParamsResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryProviderMetaDataRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryProviderMetaDataRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryProviderMetaDataRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Provider", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Provider = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryProviderMetaDataResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryProviderMetaDataResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryProviderMetaDataResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MetaData", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MetaData = append(m.MetaData, ProviderMetadata{}) + if err := m.MetaData[len(m.MetaData)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/epochstorage/types/query.pb.gw.go b/x/epochstorage/types/query.pb.gw.go index 66cc24ed93..29270cc94c 100644 --- a/x/epochstorage/types/query.pb.gw.go +++ b/x/epochstorage/types/query.pb.gw.go @@ -249,6 +249,60 @@ func local_request_Query_FixatedParamsAll_0(ctx context.Context, marshaler runti } +func request_Query_ProviderMetaData_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryProviderMetaDataRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["provider"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") + } + + protoReq.Provider, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) + } + + msg, err := client.ProviderMetaData(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_ProviderMetaData_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryProviderMetaDataRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["provider"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "provider") + } + + protoReq.Provider, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "provider", err) + } + + msg, err := server.ProviderMetaData(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -393,6 +447,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_ProviderMetaData_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ProviderMetaData_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ProviderMetaData_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -554,6 +631,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_ProviderMetaData_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_ProviderMetaData_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ProviderMetaData_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -569,6 +666,8 @@ var ( pattern_Query_FixatedParams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"lavanet", "lava", "epochstorage", "fixated_params", "index"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_FixatedParamsAll_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"lavanet", "lava", "epochstorage", "fixated_params"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_ProviderMetaData_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"lavanet", "lava", "epochstorage", "provider_metadata", "provider"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -583,4 +682,6 @@ var ( forward_Query_FixatedParams_0 = runtime.ForwardResponseMessage forward_Query_FixatedParamsAll_0 = runtime.ForwardResponseMessage + + forward_Query_ProviderMetaData_0 = runtime.ForwardResponseMessage ) From dbf4f3690949fcc0ac18d067539fe479f566e722 Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Thu, 19 Sep 2024 17:33:55 +0300 Subject: [PATCH 18/27] fix health --- protocol/monitoring/health.go | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/protocol/monitoring/health.go b/protocol/monitoring/health.go index e0d564e34b..097676313c 100644 --- a/protocol/monitoring/health.go +++ b/protocol/monitoring/health.go @@ -19,7 +19,6 @@ import ( "github.com/lavanet/lava/v3/protocol/rpcprovider" "github.com/lavanet/lava/v3/utils" "github.com/lavanet/lava/v3/utils/rand" - dualstakingtypes "github.com/lavanet/lava/v3/x/dualstaking/types" epochstoragetypes "github.com/lavanet/lava/v3/x/epochstorage/types" pairingtypes "github.com/lavanet/lava/v3/x/pairing/types" protocoltypes "github.com/lavanet/lava/v3/x/protocol/types" @@ -128,7 +127,7 @@ func RunHealth(ctx context.Context, errCh := make(chan error, 1) // get a list of all necessary specs for the test - dualStakingQuerier := dualstakingtypes.NewQueryClient(clientCtx) + epochstorageQuerier := epochstoragetypes.NewQueryClient(clientCtx) if getAllProviders { // var specResp *spectypes.QueryGetSpecResponse var specsResp *spectypes.QueryShowAllChainsResponse @@ -157,28 +156,23 @@ func RunHealth(ctx context.Context, defer wgproviders.Done() var err error for i := 0; i < BasicQueryRetries; i++ { - var response *dualstakingtypes.QueryDelegatorProvidersResponse + var response *epochstoragetypes.QueryProviderMetaDataResponse queryCtx, cancel := context.WithTimeout(ctx, 2*time.Second) - response, err = dualStakingQuerier.DelegatorProviders(queryCtx, &dualstakingtypes.QueryDelegatorProvidersRequest{ - Delegator: providerAddress, - WithPending: false, - }) + response, err = epochstorageQuerier.ProviderMetaData(queryCtx, &epochstoragetypes.QueryProviderMetaDataRequest{Provider: providerAddress}) cancel() if err != nil || response == nil { time.Sleep(QuerySleepTime) continue } - delegations := response.GetDelegations() - for _, delegation := range delegations { - if delegation.Provider == providerAddress { - // healthResults.setSpec(&spectypes.Spec{Index: delegation.ChainID}) // fix yarom - // for _, apiInterface := range chainIdToApiInterfaces[delegation.ChainID] { - // healthResults.SetProviderData(LavaEntity{ - // Address: providerAddress, - // SpecId: delegation.ChainID, - // ApiInterface: apiInterface, - // }, ReplyData{}) - // } + + for _, chain := range response.MetaData[0].Chains { + healthResults.setSpec(&spectypes.Spec{Index: chain}) // fix yarom + for _, apiInterface := range chainIdToApiInterfaces[chain] { + healthResults.SetProviderData(LavaEntity{ + Address: providerAddress, + SpecId: chain, + ApiInterface: apiInterface, + }, ReplyData{}) } } return From 5f9413ed94f42a43d2aac62edd85629bc32c065f Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Thu, 19 Sep 2024 17:35:27 +0300 Subject: [PATCH 19/27] small fixes --- protocol/monitoring/health.go | 2 +- x/pairing/client/cli/tx.go | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/protocol/monitoring/health.go b/protocol/monitoring/health.go index 097676313c..10d68d283c 100644 --- a/protocol/monitoring/health.go +++ b/protocol/monitoring/health.go @@ -166,7 +166,7 @@ func RunHealth(ctx context.Context, } for _, chain := range response.MetaData[0].Chains { - healthResults.setSpec(&spectypes.Spec{Index: chain}) // fix yarom + healthResults.setSpec(&spectypes.Spec{Index: chain}) for _, apiInterface := range chainIdToApiInterfaces[chain] { healthResults.SetProviderData(LavaEntity{ Address: providerAddress, diff --git a/x/pairing/client/cli/tx.go b/x/pairing/client/cli/tx.go index efbd6c4193..5a7e8a042e 100644 --- a/x/pairing/client/cli/tx.go +++ b/x/pairing/client/cli/tx.go @@ -134,12 +134,10 @@ func NewSubmitUnstakeProposalTxCmd() *cobra.Command { content.ProvidersInfo = []types.ProviderUnstakeInfo{{Provider: providerEntry.Address, ChainId: providerEntry.Chain}} content.DelegatorsSlashing = []types.DelegatorSlashing{} for _, delegator := range delegators.Delegations { - // if delegator.ChainID == providerEntry.Chain { // fix yarom content.DelegatorsSlashing = append(content.DelegatorsSlashing, types.DelegatorSlashing{ Delegator: delegator.Delegator, SlashingAmount: sdk.NewCoin(commontypes.TokenDenom, delegator.Amount.Amount.MulRaw(int64(slashfactor)).QuoRaw(100)), }) - // } } } From a22a80c857a6b041a8ecf8939a628c01e396ef17 Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Thu, 19 Sep 2024 17:36:13 +0300 Subject: [PATCH 20/27] lint --- x/pairing/keeper/migrations.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x/pairing/keeper/migrations.go b/x/pairing/keeper/migrations.go index a053ee3760..978719c1b5 100644 --- a/x/pairing/keeper/migrations.go +++ b/x/pairing/keeper/migrations.go @@ -44,8 +44,7 @@ func (m Migrator) MigrateVersion4To5(ctx sdk.Context) error { if e.Vault != e.Address { if biggestVault == nil { biggestVault = e - } else { - if biggestVault.Stake.Amount.LT(e.Stake.Amount) { + } else if biggestVault.Stake.Amount.LT(e.Stake.Amount) { biggestVault = e } } From 67baa9d2818c84d6d2504893e6f1f95d1a2feea7 Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Thu, 19 Sep 2024 17:39:29 +0300 Subject: [PATCH 21/27] lint --- x/pairing/keeper/migrations.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/pairing/keeper/migrations.go b/x/pairing/keeper/migrations.go index 978719c1b5..2115904832 100644 --- a/x/pairing/keeper/migrations.go +++ b/x/pairing/keeper/migrations.go @@ -45,8 +45,7 @@ func (m Migrator) MigrateVersion4To5(ctx sdk.Context) error { if biggestVault == nil { biggestVault = e } else if biggestVault.Stake.Amount.LT(e.Stake.Amount) { - biggestVault = e - } + biggestVault = e } } } @@ -94,5 +93,6 @@ func (m Migrator) MigrateVersion4To5(ctx sdk.Context) error { // set the metadata m.keeper.epochStorageKeeper.SetMetadata(ctx, metadata) } + return nil } From 391608a502231a9c02c50fe7557758ff0cc41cee Mon Sep 17 00:00:00 2001 From: Yarom Swisa Date: Thu, 19 Sep 2024 17:54:05 +0300 Subject: [PATCH 22/27] Trigger workflow From c83629bd461f19364dbebefb5e73192f85aaf517 Mon Sep 17 00:00:00 2001 From: Yaroms Date: Thu, 19 Sep 2024 23:01:14 +0300 Subject: [PATCH 23/27] use lava slices --- x/pairing/keeper/staking.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x/pairing/keeper/staking.go b/x/pairing/keeper/staking.go index 3785cf84db..a6c42d1120 100644 --- a/x/pairing/keeper/staking.go +++ b/x/pairing/keeper/staking.go @@ -2,7 +2,9 @@ package keeper import ( "fmt" - "slices" + + slices "github.com/lavanet/lava/v3/utils/lavaslices" + "strconv" "time" From b2865e54f4e9197294835e6c1d194c7119010825 Mon Sep 17 00:00:00 2001 From: Yaroms Date: Thu, 19 Sep 2024 23:08:08 +0300 Subject: [PATCH 24/27] lint --- x/pairing/keeper/staking.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/x/pairing/keeper/staking.go b/x/pairing/keeper/staking.go index a6c42d1120..de215c188a 100644 --- a/x/pairing/keeper/staking.go +++ b/x/pairing/keeper/staking.go @@ -2,15 +2,13 @@ package keeper import ( "fmt" - - slices "github.com/lavanet/lava/v3/utils/lavaslices" - "strconv" "time" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/lavanet/lava/v3/utils" + "github.com/lavanet/lava/v3/utils/lavaslices" epochstoragetypes "github.com/lavanet/lava/v3/x/epochstorage/types" "github.com/lavanet/lava/v3/x/pairing/types" planstypes "github.com/lavanet/lava/v3/x/plans/types" @@ -43,7 +41,7 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin ) } - if !slices.Contains(metadata.Chains, chainID) { + if !lavaslices.Contains(metadata.Chains, chainID) { metadata.Chains = append(metadata.Chains, chainID) } k.epochStorageKeeper.SetMetadata(ctx, metadata) From 44686d84297fad30d940c3728726cb8f909708d4 Mon Sep 17 00:00:00 2001 From: Yaroms Date: Fri, 20 Sep 2024 01:16:57 +0300 Subject: [PATCH 25/27] small changes --- utils/lavaslices/slices.go | 9 +++++++++ x/pairing/keeper/migrations.go | 3 ++- x/pairing/keeper/staking.go | 8 ++------ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/utils/lavaslices/slices.go b/utils/lavaslices/slices.go index 747b5fc3f0..abad07d4f1 100644 --- a/utils/lavaslices/slices.go +++ b/utils/lavaslices/slices.go @@ -146,6 +146,15 @@ func Remove[T comparable](slice []T, elem T) ([]T, bool) { return slice, false } +func AddUnique[T comparable](slice []T, elem T) []T { + for _, e := range slice { + if e == elem { + return slice + } + } + return append(slice, elem) +} + func IsSubset[T comparable](subset, superset []T) bool { subsetMap := make(map[T]bool) commonMap := make(map[T]bool) diff --git a/x/pairing/keeper/migrations.go b/x/pairing/keeper/migrations.go index 2115904832..925b349544 100644 --- a/x/pairing/keeper/migrations.go +++ b/x/pairing/keeper/migrations.go @@ -4,6 +4,7 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/lavanet/lava/v3/utils/lavaslices" epochstoragetypes "github.com/lavanet/lava/v3/x/epochstorage/types" v2 "github.com/lavanet/lava/v3/x/pairing/migrations/v2" ) @@ -85,7 +86,7 @@ func (m Migrator) MigrateVersion4To5(ctx sdk.Context) error { // calculate delegate total and update the entry for _, entry := range entries { - metadata.Chains = append(metadata.Chains, entry.Chain) + metadata.Chains = lavaslices.AddUnique(metadata.Chains, entry.Chain) entry.DelegateTotal = sdk.NewCoin(m.keeper.stakingKeeper.BondDenom(ctx), metadata.TotalDelegations.Amount.Mul(entry.Stake.Amount).Quo(TotalSelfDelegation)) m.keeper.epochStorageKeeper.SetStakeEntryCurrent(ctx, *entry) } diff --git a/x/pairing/keeper/staking.go b/x/pairing/keeper/staking.go index de215c188a..caa1add209 100644 --- a/x/pairing/keeper/staking.go +++ b/x/pairing/keeper/staking.go @@ -8,7 +8,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/lavanet/lava/v3/utils" - "github.com/lavanet/lava/v3/utils/lavaslices" epochstoragetypes "github.com/lavanet/lava/v3/x/epochstorage/types" "github.com/lavanet/lava/v3/x/pairing/types" planstypes "github.com/lavanet/lava/v3/x/plans/types" @@ -26,12 +25,14 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin metadata, err := k.epochStorageKeeper.GetMetadata(ctx, provider) if err != nil { + // first provider with this address metadata = epochstoragetypes.ProviderMetadata{ Provider: provider, Vault: creator, Chains: []string{chainID}, TotalDelegations: sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), sdk.ZeroInt()), } + k.epochStorageKeeper.SetMetadata(ctx, metadata) } if creator != metadata.Vault { @@ -41,11 +42,6 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin ) } - if !lavaslices.Contains(metadata.Chains, chainID) { - metadata.Chains = append(metadata.Chains, chainID) - } - k.epochStorageKeeper.SetMetadata(ctx, metadata) - spec, err := k.specKeeper.GetExpandedSpec(ctx, specChainID) if err != nil || !spec.Enabled { return utils.LavaFormatWarning("spec not found or not active", err, From 28f3d735871104f24470df6a1dc421b28224306e Mon Sep 17 00:00:00 2001 From: Yaroms Date: Fri, 20 Sep 2024 01:30:15 +0300 Subject: [PATCH 26/27] fix --- x/pairing/keeper/staking.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x/pairing/keeper/staking.go b/x/pairing/keeper/staking.go index caa1add209..034e05a068 100644 --- a/x/pairing/keeper/staking.go +++ b/x/pairing/keeper/staking.go @@ -8,6 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/lavanet/lava/v3/utils" + "github.com/lavanet/lava/v3/utils/lavaslices" epochstoragetypes "github.com/lavanet/lava/v3/x/epochstorage/types" "github.com/lavanet/lava/v3/x/pairing/types" planstypes "github.com/lavanet/lava/v3/x/plans/types" @@ -32,9 +33,11 @@ func (k Keeper) StakeNewEntry(ctx sdk.Context, validator, creator, chainID strin Chains: []string{chainID}, TotalDelegations: sdk.NewCoin(k.stakingKeeper.BondDenom(ctx), sdk.ZeroInt()), } - k.epochStorageKeeper.SetMetadata(ctx, metadata) } + metadata.Chains = lavaslices.AddUnique(metadata.Chains, chainID) + k.epochStorageKeeper.SetMetadata(ctx, metadata) + if creator != metadata.Vault { return utils.LavaFormatWarning("creator does not match the provider vault", err, utils.Attribute{Key: "vault", Value: metadata.Vault}, From cea25329f6e056503275f8bc7ec12183e422fb40 Mon Sep 17 00:00:00 2001 From: Luis Lopez Date: Thu, 19 Sep 2024 21:50:20 -0500 Subject: [PATCH 27/27] Use Go version file for Lint job --- .github/workflows/lint.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 932e04cecb..38499c275b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,13 +12,14 @@ jobs: lint: runs-on: ubuntu-latest steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Install Go uses: actions/setup-go@v5 with: - go-version: 1.20.5 - - - name: Checkout code - uses: actions/checkout@v4 + go-version-file: go.mod + cache-dependency-path: go.sum - name: Lint uses: golangci/golangci-lint-action@v4