diff --git a/aclmapping/staking/mappings.go b/aclmapping/staking/mappings.go index ed3eb9fc8c..70a280f1c8 100644 --- a/aclmapping/staking/mappings.go +++ b/aclmapping/staking/mappings.go @@ -7,8 +7,10 @@ import ( sdkacltypes "github.com/cosmos/cosmos-sdk/types/accesscontrol" aclkeeper "github.com/cosmos/cosmos-sdk/x/accesscontrol/keeper" acltypes "github.com/cosmos/cosmos-sdk/x/accesscontrol/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - utils "github.com/sei-protocol/sei-chain/aclmapping/utils" ) var ErrorInvalidMsgType = fmt.Errorf("invalid message received for staking module") @@ -32,64 +34,168 @@ func MsgDelegateDependencyGenerator(keeper aclkeeper.Keeper, ctx sdk.Context, ms return []sdkacltypes.AccessOperation{}, ErrorInvalidMsgType } + bondedModuleAdr := keeper.AccountKeeper.GetModuleAddress(stakingtypes.BondedPoolName) + notBondedModuleAdr := keeper.AccountKeeper.GetModuleAddress(stakingtypes.NotBondedPoolName) + + delegateAddr, _ := sdk.AccAddressFromBech32(msgDelegate.DelegatorAddress) + validatorAddr, _ := sdk.ValAddressFromBech32(msgDelegate.ValidatorAddress) + + validator, _ := keeper.StakingKeeper.GetValidator(ctx, validatorAddr) + // validatorCons, _ := validator.GetConsAddr() + // validatorAddrCons := string(stakingtypes.GetValidatorByConsAddrKey(validatorCons)) + // validatorOperatorAddr := validator.GetOperator().String() + + delegationKey := string(stakingtypes.GetDelegationKey(delegateAddr, validatorAddr)) + validatorKey := string(stakingtypes.GetValidatorKey(validatorAddr)) + delegatorBalanceKey := string(banktypes.CreateAccountBalancesPrefixFromBech32(msgDelegate.DelegatorAddress)) + validatorBalanceKey := string(banktypes.CreateAccountBalancesPrefixFromBech32(msgDelegate.ValidatorAddress)) + // validatorOperatorBalanceKey := string(banktypes.CreateAccountBalancesPrefixFromBech32(validatorOperatorAddr)) + accessOperations := []sdkacltypes.AccessOperation{ - // Checks if the delegator exists - // Checks if there is a delegation object that already exists for (delegatorAddr, validatorAddr) + // Treat Delegations and Undelegations to have the same ACL since they are highly coupled, no point in finer granularization + + // Get delegation/redelegations and error checking { AccessType: sdkacltypes.AccessType_READ, ResourceType: sdkacltypes.ResourceType_KV_STAKING_DELEGATION, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgDelegate.DelegatorAddress+msgDelegate.ValidatorAddress), + IdentifierTemplate: delegationKey, }, - // Store new delegator for (delegator, validator) + // Update/delete delegation and update redelegation { AccessType: sdkacltypes.AccessType_WRITE, ResourceType: sdkacltypes.ResourceType_KV_STAKING_DELEGATION, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgDelegate.DelegatorAddress+msgDelegate.ValidatorAddress), + IdentifierTemplate: delegationKey, + }, + + // Check Unbonding + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATORS_BY_POWER, + IdentifierTemplate: string(stakingtypes.GetValidatorsByPowerIndexKey(validator, keeper.StakingKeeper.PowerReduction(ctx))), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATORS_BY_POWER, + IdentifierTemplate: string(stakingtypes.GetValidatorsByPowerIndexKey(validator, keeper.StakingKeeper.PowerReduction(ctx))), + }, + + // Before Unbond Distribution Hook + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_DELEGATOR_STARTING_INFO, + IdentifierTemplate: string(distributiontypes.GetDelegatorStartingInfoKey(validatorAddr, delegateAddr)), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_DELEGATOR_STARTING_INFO, + IdentifierTemplate: string(distributiontypes.GetDelegatorStartingInfoKey(validatorAddr, delegateAddr)), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_CURRENT_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorCurrentRewardsKey(validatorAddr)), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_CURRENT_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorCurrentRewardsKey(validatorAddr)), + }, + + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_OUTSTANDING_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorOutstandingRewardsKey(validatorAddr)), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_OUTSTANDING_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorOutstandingRewardsKey(validatorAddr)), }, - // delegate coins from account validator account { AccessType: sdkacltypes.AccessType_READ, - ResourceType: sdkacltypes.ResourceType_KV_BANK, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgDelegate.DelegatorAddress), + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_FEE_POOL, + IdentifierTemplate: string(distributiontypes.FeePoolKey), }, { AccessType: sdkacltypes.AccessType_WRITE, - ResourceType: sdkacltypes.ResourceType_KV_BANK, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgDelegate.DelegatorAddress), + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_FEE_POOL, + IdentifierTemplate: string(distributiontypes.FeePoolKey), }, + { AccessType: sdkacltypes.AccessType_READ, - ResourceType: sdkacltypes.ResourceType_KV_BANK, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgDelegate.ValidatorAddress), + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_HISTORICAL_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorHistoricalRewardsPrefix(validatorAddr)), }, { AccessType: sdkacltypes.AccessType_WRITE, - ResourceType: sdkacltypes.ResourceType_KV_BANK, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgDelegate.ValidatorAddress), + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_HISTORICAL_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorHistoricalRewardsPrefix(validatorAddr)), + }, + + // Gets Module Account information + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_AUTH_ADDRESS_STORE, + IdentifierTemplate: string(authtypes.AddressStoreKey(bondedModuleAdr)), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_AUTH_ADDRESS_STORE, + IdentifierTemplate: string(authtypes.AddressStoreKey(notBondedModuleAdr)), + }, + + // Get Delegator Acc Info + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_AUTH_ADDRESS_STORE, + IdentifierTemplate: string(authtypes.AddressStoreKey(delegateAddr)), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_AUTH_ADDRESS_STORE, + IdentifierTemplate: string(authtypes.AddressStoreKey(delegateAddr)), + }, + + // Update the delegator and validator account balances + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_BANK_BALANCES, + IdentifierTemplate: delegatorBalanceKey, + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_BANK_BALANCES, + IdentifierTemplate: delegatorBalanceKey, + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_BANK_BALANCES, + IdentifierTemplate: validatorBalanceKey, + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_BANK_BALANCES, + IdentifierTemplate: validatorBalanceKey, }, // Checks if the validators exchange rate is valid { AccessType: sdkacltypes.AccessType_READ, ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATOR, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgDelegate.ValidatorAddress), + IdentifierTemplate: validatorKey, }, // Update validator shares and power index { AccessType: sdkacltypes.AccessType_WRITE, ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATOR, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgDelegate.ValidatorAddress), + IdentifierTemplate: validatorKey, }, // Last Operation should always be a commit - { - ResourceType: sdkacltypes.ResourceType_ANY, - AccessType: sdkacltypes.AccessType_COMMIT, - IdentifierTemplate: utils.DefaultIDTemplate, - }, + *acltypes.CommitAccessOp(), } - return accessOperations, nil } @@ -98,6 +204,20 @@ func MsgUndelegateDependencyGenerator(keeper aclkeeper.Keeper, ctx sdk.Context, if !ok { return []sdkacltypes.AccessOperation{}, ErrorInvalidMsgType } + bondedModuleAdr := keeper.AccountKeeper.GetModuleAddress(stakingtypes.BondedPoolName) + notBondedModuleAdr := keeper.AccountKeeper.GetModuleAddress(stakingtypes.NotBondedPoolName) + + delegateAddr, _ := sdk.AccAddressFromBech32(msgUndelegate.DelegatorAddress) + validatorAddr, _ := sdk.ValAddressFromBech32(msgUndelegate.ValidatorAddress) + + validator, _ := keeper.StakingKeeper.GetValidator(ctx, validatorAddr) + validatorCons, _ := validator.GetConsAddr() + validatorAddrCons := string(stakingtypes.GetValidatorByConsAddrKey(validatorCons)) + + delegationKey := string(stakingtypes.GetDelegationKey(delegateAddr, validatorAddr)) + validatorKey := string(stakingtypes.GetValidatorKey(validatorAddr)) + delegatorBalanceKey := string(banktypes.CreateAccountBalancesPrefixFromBech32(msgUndelegate.DelegatorAddress)) + validatorBalanceKey := string(banktypes.CreateAccountBalancesPrefixFromBech32(msgUndelegate.ValidatorAddress)) accessOperations := []sdkacltypes.AccessOperation{ // Treat Delegations and Undelegations to have the same ACL since they are highly coupled, no point in finer granularization @@ -106,56 +226,180 @@ func MsgUndelegateDependencyGenerator(keeper aclkeeper.Keeper, ctx sdk.Context, { AccessType: sdkacltypes.AccessType_READ, ResourceType: sdkacltypes.ResourceType_KV_STAKING_DELEGATION, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgUndelegate.DelegatorAddress+msgUndelegate.ValidatorAddress), + IdentifierTemplate: delegationKey, }, // Update/delete delegation and update redelegation { AccessType: sdkacltypes.AccessType_WRITE, ResourceType: sdkacltypes.ResourceType_KV_STAKING_DELEGATION, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgUndelegate.DelegatorAddress+msgUndelegate.ValidatorAddress), + IdentifierTemplate: delegationKey, + }, + + // Check Unbonding + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_UNBONDING_DELEGATION, + IdentifierTemplate: string(stakingtypes.GetUBDKey(delegateAddr, validatorAddr)), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_UNBONDING_DELEGATION, + IdentifierTemplate: string(stakingtypes.GetUBDKey(delegateAddr, validatorAddr)), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_UNBONDING_DELEGATION_VAL, + IdentifierTemplate: string(stakingtypes.GetUBDsByValIndexKey(validatorAddr)), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_UNBONDING_DELEGATION_VAL, + IdentifierTemplate: string(stakingtypes.GetUBDsByValIndexKey(validatorAddr)), + }, + + // Testing + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_UNBONDING_DELEGATION, + IdentifierTemplate: delegationKey, + }, + + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_UNBONDING, + IdentifierTemplate: string(stakingtypes.UnbondingQueueKey), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_UNBONDING, + IdentifierTemplate: string(stakingtypes.UnbondingQueueKey), + }, + + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATORS_CON_ADDR, + IdentifierTemplate: validatorAddrCons, + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATORS_CON_ADDR, + IdentifierTemplate: string(stakingtypes.GetUBDsByValIndexKey(validatorAddr)), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATORS_BY_POWER, + IdentifierTemplate: string(stakingtypes.GetValidatorsByPowerIndexKey(validator, keeper.StakingKeeper.PowerReduction(ctx))), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATORS_BY_POWER, + IdentifierTemplate: string(stakingtypes.GetValidatorsByPowerIndexKey(validator, keeper.StakingKeeper.PowerReduction(ctx))), + }, + + // Before Unbond Distribution Hook + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_DELEGATOR_STARTING_INFO, + IdentifierTemplate: string(distributiontypes.GetDelegatorStartingInfoKey(validatorAddr, delegateAddr)), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_CURRENT_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorCurrentRewardsKey(validatorAddr)), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_CURRENT_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorCurrentRewardsKey(validatorAddr)), + }, + + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_OUTSTANDING_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorOutstandingRewardsKey(validatorAddr)), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_OUTSTANDING_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorOutstandingRewardsKey(validatorAddr)), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_FEE_POOL, + IdentifierTemplate: string(distributiontypes.FeePoolKey), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_FEE_POOL, + IdentifierTemplate: string(distributiontypes.FeePoolKey), + }, + + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_HISTORICAL_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorHistoricalRewardsPrefix(validatorAddr)), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_HISTORICAL_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorHistoricalRewardsPrefix(validatorAddr)), + }, + + // Gets Module Account information + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_AUTH_ADDRESS_STORE, + IdentifierTemplate: string(authtypes.AddressStoreKey(bondedModuleAdr)), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_AUTH_ADDRESS_STORE, + IdentifierTemplate: string(authtypes.AddressStoreKey(notBondedModuleAdr)), + }, + + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_DELEGATOR_STARTING_INFO, + IdentifierTemplate: string(distributiontypes.GetDelegatorStartingInfoKey(validatorAddr, delegateAddr)), }, // Update the delegator and validator account balances { AccessType: sdkacltypes.AccessType_READ, - ResourceType: sdkacltypes.ResourceType_KV_BANK, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgUndelegate.DelegatorAddress), + ResourceType: sdkacltypes.ResourceType_KV_BANK_BALANCES, + IdentifierTemplate: delegatorBalanceKey, }, { AccessType: sdkacltypes.AccessType_WRITE, - ResourceType: sdkacltypes.ResourceType_KV_BANK, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgUndelegate.DelegatorAddress), + ResourceType: sdkacltypes.ResourceType_KV_BANK_BALANCES, + IdentifierTemplate: delegatorBalanceKey, }, { AccessType: sdkacltypes.AccessType_READ, - ResourceType: sdkacltypes.ResourceType_KV_BANK, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgUndelegate.ValidatorAddress), + ResourceType: sdkacltypes.ResourceType_KV_BANK_BALANCES, + IdentifierTemplate: validatorBalanceKey, }, { AccessType: sdkacltypes.AccessType_WRITE, - ResourceType: sdkacltypes.ResourceType_KV_BANK, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgUndelegate.ValidatorAddress), + ResourceType: sdkacltypes.ResourceType_KV_BANK_BALANCES, + IdentifierTemplate: validatorBalanceKey, }, // Checks if the validators exchange rate is valid { AccessType: sdkacltypes.AccessType_READ, ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATOR, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgUndelegate.ValidatorAddress), + IdentifierTemplate: validatorKey, }, // Update validator shares and power index { AccessType: sdkacltypes.AccessType_WRITE, ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATOR, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgUndelegate.ValidatorAddress), + IdentifierTemplate: validatorKey, }, // Last Operation should always be a commit - { - ResourceType: sdkacltypes.ResourceType_ANY, - AccessType: sdkacltypes.AccessType_COMMIT, - IdentifierTemplate: utils.DefaultIDTemplate, - }, + *acltypes.CommitAccessOp(), } return accessOperations, nil @@ -166,95 +410,244 @@ func MsgBeginRedelegateDependencyGenerator(keeper aclkeeper.Keeper, ctx sdk.Cont if !ok { return []sdkacltypes.AccessOperation{}, ErrorInvalidMsgType } + bondedModuleAdr := keeper.AccountKeeper.GetModuleAddress(stakingtypes.BondedPoolName) + notBondedModuleAdr := keeper.AccountKeeper.GetModuleAddress(stakingtypes.NotBondedPoolName) + + delegateAddr, _ := sdk.AccAddressFromBech32(msgBeingRedelegate.DelegatorAddress) + srcValidatorAddr, _ := sdk.ValAddressFromBech32(msgBeingRedelegate.ValidatorSrcAddress) + dstValidatorAddr, _ := sdk.ValAddressFromBech32(msgBeingRedelegate.ValidatorDstAddress) + + srcValidator, _ := keeper.StakingKeeper.GetValidator(ctx, srcValidatorAddr) + dstValidator, _ := keeper.StakingKeeper.GetValidator(ctx, dstValidatorAddr) + + srcDelegationKey := string(stakingtypes.GetDelegationKey(delegateAddr, srcValidatorAddr)) + dstDelegationKey := string(stakingtypes.GetDelegationKey(delegateAddr, dstValidatorAddr)) + + srcValidatorKey := string(stakingtypes.GetValidatorKey(srcValidatorAddr)) + dstValidatorKey := string(stakingtypes.GetValidatorKey(dstValidatorAddr)) + + dstValidatorBalanceKey := string(banktypes.CreateAccountBalancesPrefixFromBech32(msgBeingRedelegate.ValidatorDstAddress)) accessOperations := []sdkacltypes.AccessOperation{ - // Treat Delegations and Redelegations to have the same ACL since they are highly coupled, no point in finer granularization + // Treat Delegations and Undelegations to have the same ACL since they are highly coupled, no point in finer granularization - // Get src delegation to verify it has sufficient funds to undelegate - // Get dest delegation to see if it already exists + // Get delegation/redelegations and error checking { AccessType: sdkacltypes.AccessType_READ, ResourceType: sdkacltypes.ResourceType_KV_STAKING_DELEGATION, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.DelegatorAddress+msgBeingRedelegate.ValidatorSrcAddress), + IdentifierTemplate: srcDelegationKey, }, { AccessType: sdkacltypes.AccessType_READ, ResourceType: sdkacltypes.ResourceType_KV_STAKING_DELEGATION, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.DelegatorAddress+msgBeingRedelegate.ValidatorDstAddress), + IdentifierTemplate: dstDelegationKey, + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_REDELEGATION, + IdentifierTemplate: string(stakingtypes.GetREDsKey(delegateAddr)), }, - // Update/delete src and destination delegation after tokens have been unbonded { AccessType: sdkacltypes.AccessType_WRITE, - ResourceType: sdkacltypes.ResourceType_KV_STAKING_DELEGATION, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.DelegatorAddress+msgBeingRedelegate.ValidatorSrcAddress), + ResourceType: sdkacltypes.ResourceType_KV_STAKING_REDELEGATION, + IdentifierTemplate: string(stakingtypes.GetREDsKey(delegateAddr)), }, + + // Update/delete delegation and update redelegation { AccessType: sdkacltypes.AccessType_WRITE, ResourceType: sdkacltypes.ResourceType_KV_STAKING_DELEGATION, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.DelegatorAddress+msgBeingRedelegate.ValidatorDstAddress), + IdentifierTemplate: dstDelegationKey, }, - // Update the delegator, src validator and dest validator account balances + // Check Unbonding + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATORS_BY_POWER, + IdentifierTemplate: string(stakingtypes.GetValidatorsByPowerIndexKey(srcValidator, keeper.StakingKeeper.PowerReduction(ctx))), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATORS_BY_POWER, + IdentifierTemplate: string(stakingtypes.GetValidatorsByPowerIndexKey(srcValidator, keeper.StakingKeeper.PowerReduction(ctx))), + }, { AccessType: sdkacltypes.AccessType_READ, - ResourceType: sdkacltypes.ResourceType_KV_BANK, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgBeingRedelegate.DelegatorAddress), + ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATORS_BY_POWER, + IdentifierTemplate: string(stakingtypes.GetValidatorsByPowerIndexKey(dstValidator, keeper.StakingKeeper.PowerReduction(ctx))), }, { AccessType: sdkacltypes.AccessType_WRITE, - ResourceType: sdkacltypes.ResourceType_KV_BANK, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgBeingRedelegate.DelegatorAddress), + ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATORS_BY_POWER, + IdentifierTemplate: string(stakingtypes.GetValidatorsByPowerIndexKey(dstValidator, keeper.StakingKeeper.PowerReduction(ctx))), }, + + // Before Unbond Distribution Hook + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_DELEGATOR_STARTING_INFO, + IdentifierTemplate: string(distributiontypes.GetDelegatorStartingInfoKey(srcValidatorAddr, delegateAddr)), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_DELEGATOR_STARTING_INFO, + IdentifierTemplate: string(distributiontypes.GetDelegatorStartingInfoKey(dstValidatorAddr, delegateAddr)), + }, + { AccessType: sdkacltypes.AccessType_READ, - ResourceType: sdkacltypes.ResourceType_KV_BANK, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgBeingRedelegate.ValidatorSrcAddress), + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_CURRENT_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorCurrentRewardsKey(srcValidatorAddr)), }, { AccessType: sdkacltypes.AccessType_WRITE, - ResourceType: sdkacltypes.ResourceType_KV_BANK, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgBeingRedelegate.ValidatorSrcAddress), + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_CURRENT_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorCurrentRewardsKey(srcValidatorAddr)), }, { AccessType: sdkacltypes.AccessType_READ, - ResourceType: sdkacltypes.ResourceType_KV_BANK, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgBeingRedelegate.ValidatorDstAddress), + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_CURRENT_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorCurrentRewardsKey(dstValidatorAddr)), }, { AccessType: sdkacltypes.AccessType_WRITE, - ResourceType: sdkacltypes.ResourceType_KV_BANK, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.BANK, msgBeingRedelegate.ValidatorDstAddress), + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_CURRENT_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorCurrentRewardsKey(dstValidatorAddr)), }, - // Update validators staking shares and power index { AccessType: sdkacltypes.AccessType_READ, - ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATOR, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.ValidatorSrcAddress), + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_OUTSTANDING_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorOutstandingRewardsKey(srcValidatorAddr)), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_OUTSTANDING_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorOutstandingRewardsKey(srcValidatorAddr)), + }, + + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_FEE_POOL, + IdentifierTemplate: string(distributiontypes.FeePoolKey), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_FEE_POOL, + IdentifierTemplate: string(distributiontypes.FeePoolKey), + }, + + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_HISTORICAL_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorHistoricalRewardsPrefix(srcValidatorAddr)), }, { AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_HISTORICAL_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorHistoricalRewardsPrefix(srcValidatorAddr)), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_HISTORICAL_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorHistoricalRewardsPrefix(dstValidatorAddr)), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_VAL_HISTORICAL_REWARDS, + IdentifierTemplate: string(distributiontypes.GetValidatorHistoricalRewardsPrefix(dstValidatorAddr)), + }, + + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_REDELEGATION_QUEUE, + IdentifierTemplate: string(stakingtypes.RedelegationQueueKey), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_REDELEGATION_QUEUE, + IdentifierTemplate: string(stakingtypes.RedelegationQueueKey), + }, + + // Gets Module Account information + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_AUTH_ADDRESS_STORE, + IdentifierTemplate: string(authtypes.AddressStoreKey(bondedModuleAdr)), + }, + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_AUTH_ADDRESS_STORE, + IdentifierTemplate: string(authtypes.AddressStoreKey(notBondedModuleAdr)), + }, + + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_DELEGATOR_STARTING_INFO, + IdentifierTemplate: string(distributiontypes.GetDelegatorStartingInfoKey(srcValidatorAddr, delegateAddr)), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_DISTRIBUTION_DELEGATOR_STARTING_INFO, + IdentifierTemplate: string(distributiontypes.GetDelegatorStartingInfoKey(dstValidatorAddr, delegateAddr)), + }, + + // Update the delegator and validator account balances + { + AccessType: sdkacltypes.AccessType_READ, + ResourceType: sdkacltypes.ResourceType_KV_BANK_BALANCES, + IdentifierTemplate: dstValidatorBalanceKey, + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_BANK_BALANCES, + IdentifierTemplate: dstValidatorBalanceKey, + }, + + // Checks if the validators exchange rate is valid + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_REDELEGATION_VAL_SRC, + IdentifierTemplate: string(stakingtypes.GetREDByValSrcIndexKey( + delegateAddr, + srcValidatorAddr, + dstValidatorAddr, + )), + }, + { + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_REDELEGATION_VAL_DST, + IdentifierTemplate: string(stakingtypes.GetREDByValDstIndexKey( + delegateAddr, + srcValidatorAddr, + dstValidatorAddr, + )), + }, + + // Checks if the validators exchange rate is valid + { + AccessType: sdkacltypes.AccessType_READ, ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATOR, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.ValidatorSrcAddress), + IdentifierTemplate: srcValidatorKey, }, { AccessType: sdkacltypes.AccessType_READ, ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATOR, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.ValidatorDstAddress), + IdentifierTemplate: dstValidatorKey, }, { AccessType: sdkacltypes.AccessType_WRITE, ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATOR, - IdentifierTemplate: utils.GetIdentifierTemplatePerModule(utils.STAKING, msgBeingRedelegate.ValidatorDstAddress), + IdentifierTemplate: srcValidatorKey, }, - - // Last Operation should always be a commit { - ResourceType: sdkacltypes.ResourceType_ANY, - AccessType: sdkacltypes.AccessType_COMMIT, - IdentifierTemplate: utils.DefaultIDTemplate, + AccessType: sdkacltypes.AccessType_WRITE, + ResourceType: sdkacltypes.ResourceType_KV_STAKING_VALIDATOR, + IdentifierTemplate: dstValidatorKey, }, - } + // Last Operation should always be a commit + *acltypes.CommitAccessOp(), + } return accessOperations, nil } diff --git a/aclmapping/staking/mappings_test.go b/aclmapping/staking/mappings_test.go index 09efb9dbe9..e1f9f64e74 100644 --- a/aclmapping/staking/mappings_test.go +++ b/aclmapping/staking/mappings_test.go @@ -1,18 +1,283 @@ -package aclstakingmapping +package aclstakingmapping_test import ( + "fmt" "testing" "time" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" - acltypes "github.com/cosmos/cosmos-sdk/x/accesscontrol/types" + sdkacltypes "github.com/cosmos/cosmos-sdk/types/accesscontrol" + "github.com/cosmos/cosmos-sdk/x/staking/keeper" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/sei-protocol/sei-chain/app" + stakingacl "github.com/sei-protocol/sei-chain/aclmapping/staking" + aclutils "github.com/sei-protocol/sei-chain/aclmapping/utils" + "github.com/sei-protocol/sei-chain/app/apptesting" oracletypes "github.com/sei-protocol/sei-chain/x/oracle/types" + + acltypes "github.com/cosmos/cosmos-sdk/x/accesscontrol/types" + "github.com/sei-protocol/sei-chain/app" "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" ) +type KeeperTestSuite struct { + apptesting.KeeperTestHelper + + queryClient stakingtypes.QueryClient + msgServer stakingtypes.MsgServer + // defaultDenom is on the suite, as it depends on the creator test address. + defaultDenom string + defaultExchangeRate string + initalBalance sdk.Coins + + validator sdk.ValAddress + newValidator sdk.ValAddress + delegateMsg *types.MsgDelegate + undelegateMsg *types.MsgUndelegate + redelegateMsg *types.MsgBeginRedelegate +} + +func TestKeeperTestSuite(t *testing.T) { + suite.Run(t, new(KeeperTestSuite)) +} + +// Runs before each test case +func (suite *KeeperTestSuite) SetupTest() { + suite.Setup() +} + +// Explicitly only run once during setup +func (suite *KeeperTestSuite) PrepareTest() { + suite.defaultDenom = "usei" + suite.defaultExchangeRate = fmt.Sprintf("%dusei", sdk.NewDec(1700)) + + suite.initalBalance = sdk.Coins{sdk.NewInt64Coin(suite.defaultDenom, 100000000000)} + suite.initalBalance = sdk.Coins{sdk.NewInt64Coin("stake", 100000000000)} + suite.FundAcc(suite.TestAccs[0], suite.initalBalance) + + suite.queryClient = stakingtypes.NewQueryClient(suite.QueryHelper) + suite.msgServer = stakingkeeper.NewMsgServerImpl(suite.App.StakingKeeper) + + msgValidator := sdkacltypes.NewMsgValidator(aclutils.StoreKeyToResourceTypePrefixMap) + suite.Ctx = suite.Ctx.WithMsgValidator(msgValidator) + + suite.Ctx = suite.Ctx.WithBlockHeight(10) + suite.Ctx = suite.Ctx.WithBlockTime(time.Unix(333, 0)) + suite.validator = suite.SetupValidator(stakingtypes.Bonded) + suite.newValidator = suite.SetupValidator(stakingtypes.Unbonded) + + notBondedPool := suite.App.StakingKeeper.GetNotBondedPool(suite.Ctx) + suite.App.AccountKeeper.SetModuleAccount(suite.Ctx, notBondedPool) + + validator, _ := suite.App.StakingKeeper.GetValidator(suite.Ctx, suite.validator) + suite.App.StakingKeeper.SetValidatorByConsAddr(suite.Ctx, validator) + + newValidator, _ := suite.App.StakingKeeper.GetValidator(suite.Ctx, suite.newValidator) + suite.App.StakingKeeper.SetValidatorByConsAddr(suite.Ctx, newValidator) + + valTokens := suite.App.StakingKeeper.TokensFromConsensusPower(suite.Ctx, 10) + validator, issuedShares := validator.AddTokensFromDel(valTokens) + validator = keeper.TestingUpdateValidator(suite.App.StakingKeeper, suite.Ctx, validator, true) + + newValTokens := suite.App.StakingKeeper.TokensFromConsensusPower(suite.Ctx, 10) + newValidator, newIssuedShares := newValidator.AddTokensFromDel(newValTokens) + newValidator = keeper.TestingUpdateValidator(suite.App.StakingKeeper, suite.Ctx, validator, true) + + val0AccAddr := sdk.AccAddress(suite.validator) + val1AccAddr := sdk.AccAddress(suite.newValidator) + + val0selfDelegation := types.NewDelegation(val0AccAddr, suite.validator, issuedShares) + val1SelfDelegation := types.NewDelegation(val1AccAddr, suite.validator, newIssuedShares) + + suite.App.StakingKeeper.SetDelegation(suite.Ctx, val0selfDelegation) + suite.App.StakingKeeper.SetDelegation(suite.Ctx, val1SelfDelegation) + + bondedPool := suite.App.StakingKeeper.GetBondedPool(suite.Ctx) + suite.App.AccountKeeper.SetModuleAccount(suite.Ctx, bondedPool) + + suite.delegateMsg = &stakingtypes.MsgDelegate{ + Amount: sdk.NewInt64Coin("stake", 10), + ValidatorAddress: suite.validator.String(), + DelegatorAddress: suite.TestAccs[0].String(), + } + suite.undelegateMsg = &stakingtypes.MsgUndelegate{ + Amount: sdk.NewInt64Coin("stake", 10), + ValidatorAddress: suite.validator.String(), + DelegatorAddress: suite.TestAccs[0].String(), + } + suite.redelegateMsg = &stakingtypes.MsgBeginRedelegate{ + Amount: sdk.NewInt64Coin("stake", 10), + ValidatorSrcAddress: suite.validator.String(), + ValidatorDstAddress: suite.newValidator.String(), + DelegatorAddress: suite.TestAccs[0].String(), + } + + _, err := suite.msgServer.Delegate( + sdk.WrapSDKContext(suite.Ctx), + suite.delegateMsg, + ) + if err != nil { + panic(err) + } +} + + +func (suite *KeeperTestSuite) TestMsgUndelegateDependencies() { + suite.PrepareTest() + tests := []struct { + name string + expectedError error + msg *stakingtypes.MsgUndelegate + dynamicDep bool + }{ + { + name: "default vote", + msg: suite.undelegateMsg, + expectedError: nil, + dynamicDep: true, + }, + { + name: "dont check synchronous", + msg: suite.undelegateMsg, + expectedError: nil, + dynamicDep: false, + }, + } + for _, tc := range tests { + suite.Run(fmt.Sprintf("Test Case: %s", tc.name), func() { + + handlerCtx, cms := aclutils.CacheTxContext(suite.Ctx) + _, err := suite.msgServer.Undelegate( + sdk.WrapSDKContext(handlerCtx), + tc.msg, + ) + depdenencies , _ := stakingacl.MsgUndelegateDependencyGenerator( + suite.App.AccessControlKeeper, + handlerCtx, + tc.msg, + ) + + if !tc.dynamicDep { + depdenencies = sdkacltypes.SynchronousAccessOps() + } + + if tc.expectedError != nil { + suite.Require().EqualError(err, tc.expectedError.Error()) + } else { + suite.Require().NoError(err) + } + + missing := handlerCtx.MsgValidator().ValidateAccessOperations(depdenencies, cms.GetEvents()) + suite.Require().Empty(missing) + }) + } +} + +func (suite *KeeperTestSuite) TestMsgRedelegateDependencies() { + suite.PrepareTest() + tests := []struct { + name string + expectedError error + msg *stakingtypes.MsgBeginRedelegate + dynamicDep bool + }{ + { + name: "default vote", + msg: suite.redelegateMsg, + expectedError: nil, + dynamicDep: true, + }, + // { + // name: "dont check synchronous", + // msg: suite.redelegateMsg, + // expectedError: nil, + // dynamicDep: false, + // }, + } + for _, tc := range tests { + suite.Run(fmt.Sprintf("Test Case: %s", tc.name), func() { + + handlerCtx, cms := aclutils.CacheTxContext(suite.Ctx) + _, err := suite.msgServer.BeginRedelegate( + sdk.WrapSDKContext(handlerCtx), + tc.msg, + ) + depdenencies , _ := stakingacl.MsgBeginRedelegateDependencyGenerator( + suite.App.AccessControlKeeper, + handlerCtx, + tc.msg, + ) + + if !tc.dynamicDep { + depdenencies = sdkacltypes.SynchronousAccessOps() + } + + if tc.expectedError != nil { + suite.Require().EqualError(err, tc.expectedError.Error()) + } else { + suite.Require().NoError(err) + } + + missing := handlerCtx.MsgValidator().ValidateAccessOperations(depdenencies, cms.GetEvents()) + suite.Require().Empty(missing) + }) + } +} + + +func (suite *KeeperTestSuite) TestMsgDelegateDependencies() { + suite.PrepareTest() + tests := []struct { + name string + expectedError error + msg *stakingtypes.MsgDelegate + dynamicDep bool + }{ + { + name: "default vote", + msg: suite.delegateMsg, + expectedError: nil, + dynamicDep: true, + }, + { + name: "dont check synchronous", + msg: suite.delegateMsg, + expectedError: nil, + dynamicDep: false, + }, + } + for _, tc := range tests { + suite.Run(fmt.Sprintf("Test Case: %s", tc.name), func() { + handlerCtx, cms := aclutils.CacheTxContext(suite.Ctx) + _, err := suite.msgServer.Delegate( + sdk.WrapSDKContext(handlerCtx), + tc.msg, + ) + depdenencies , _ := stakingacl.MsgDelegateDependencyGenerator( + suite.App.AccessControlKeeper, + handlerCtx, + tc.msg, + ) + + if !tc.dynamicDep { + depdenencies = sdkacltypes.SynchronousAccessOps() + } + + if tc.expectedError != nil { + suite.Require().EqualError(err, tc.expectedError.Error()) + } else { + suite.Require().NoError(err) + } + + missing := handlerCtx.MsgValidator().ValidateAccessOperations(depdenencies, cms.GetEvents()) + suite.Require().Empty(missing) + }) + } +} + func TestGeneratorInvalidMessageTypes(t *testing.T) { tm := time.Now().UTC() valPub := secp256k1.GenPrivKey().PubKey() @@ -29,65 +294,49 @@ func TestGeneratorInvalidMessageTypes(t *testing.T) { Validator: "validator", } - _, err := MsgDelegateDependencyGenerator(testWrapper.App.AccessControlKeeper, testWrapper.Ctx, &oracleVote) + _, err := stakingacl.MsgUndelegateDependencyGenerator(testWrapper.App.AccessControlKeeper, testWrapper.Ctx, &oracleVote) require.Error(t, err) - _, err = MsgUndelegateDependencyGenerator(testWrapper.App.AccessControlKeeper, testWrapper.Ctx, &stakingDelegate) + _, err = stakingacl.MsgUndelegateDependencyGenerator(testWrapper.App.AccessControlKeeper, testWrapper.Ctx, &stakingDelegate) require.Error(t, err) - _, err = MsgBeginRedelegateDependencyGenerator(testWrapper.App.AccessControlKeeper, testWrapper.Ctx, &stakingDelegate) + _, err = stakingacl.MsgUndelegateDependencyGenerator(testWrapper.App.AccessControlKeeper, testWrapper.Ctx, &stakingDelegate) require.Error(t, err) } -func TestMsgDelegateGenerator(t *testing.T) { - tm := time.Now().UTC() - valPub := secp256k1.GenPrivKey().PubKey() - testWrapper := app.NewTestWrapper(t, tm, valPub) - - stakingDelegate := stakingtypes.MsgDelegate{ - DelegatorAddress: "delegator", - ValidatorAddress: "validator", - Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(5)}, - } +func (suite *KeeperTestSuite) TestMsgDelegateGenerator() { + suite.PrepareTest() + stakingDelegate := suite.delegateMsg - accessOps, err := MsgDelegateDependencyGenerator(testWrapper.App.AccessControlKeeper, testWrapper.Ctx, &stakingDelegate) - require.NoError(t, err) + accessOps, err := stakingacl.MsgDelegateDependencyGenerator( + suite.App.AccessControlKeeper, + suite.Ctx, + stakingDelegate, + ) + require.NoError(suite.T(), err) err = acltypes.ValidateAccessOps(accessOps) - require.NoError(t, err) + require.NoError(suite.T(), err) } -func TestMsgUndelegateGenerator(t *testing.T) { - tm := time.Now().UTC() - valPub := secp256k1.GenPrivKey().PubKey() - - testWrapper := app.NewTestWrapper(t, tm, valPub) - - stakingUndelegate := stakingtypes.MsgUndelegate{ - DelegatorAddress: "delegator", - ValidatorAddress: "validator", - Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(5)}, - } - - accessOps, err := MsgUndelegateDependencyGenerator(testWrapper.App.AccessControlKeeper, testWrapper.Ctx, &stakingUndelegate) - require.NoError(t, err) +func (suite *KeeperTestSuite) TestMsgUndelegateGenerator() { + suite.PrepareTest() + accessOps, err := stakingacl.MsgUndelegateDependencyGenerator( + suite.App.AccessControlKeeper, + suite.Ctx, + suite.undelegateMsg, + ) + require.NoError(suite.T(), err) err = acltypes.ValidateAccessOps(accessOps) - require.NoError(t, err) + require.NoError(suite.T(), err) } -func TestMsgBeginRedelegateGenerator(t *testing.T) { - tm := time.Now().UTC() - valPub := secp256k1.GenPrivKey().PubKey() - - testWrapper := app.NewTestWrapper(t, tm, valPub) - - stakingBeginRedelegate := stakingtypes.MsgBeginRedelegate{ - DelegatorAddress: "delegator", - ValidatorSrcAddress: "src_validator", - ValidatorDstAddress: "dst_validator", - Amount: sdk.Coin{Denom: "usei", Amount: sdk.NewInt(5)}, - } - - accessOps, err := MsgBeginRedelegateDependencyGenerator(testWrapper.App.AccessControlKeeper, testWrapper.Ctx, &stakingBeginRedelegate) - require.NoError(t, err) +func (suite *KeeperTestSuite) TestMsgBeginRedelegateGenerator() { + suite.PrepareTest() + accessOps, err := stakingacl.MsgBeginRedelegateDependencyGenerator( + suite.App.AccessControlKeeper, + suite.Ctx, + suite.redelegateMsg, + ) + require.NoError(suite.T(), err) err = acltypes.ValidateAccessOps(accessOps) - require.NoError(t, err) + require.NoError(suite.T(), err) } diff --git a/aclmapping/tokenfactory/mappings.go b/aclmapping/tokenfactory/mappings.go index 752e6f3155..1a48909742 100644 --- a/aclmapping/tokenfactory/mappings.go +++ b/aclmapping/tokenfactory/mappings.go @@ -152,7 +152,7 @@ func TokenFactoryBurnDependencyGenerator(keeper aclkeeper.Keeper, ctx sdk.Contex // Gets Module Account Balance { AccessType: sdkacltypes.AccessType_READ, - ResourceType: sdkacltypes.ResourceType_KV_AUTH, + ResourceType: sdkacltypes.ResourceType_KV_AUTH_ADDRESS_STORE, IdentifierTemplate: string(authtypes.AddressStoreKey(moduleAdr)), }, diff --git a/aclmapping/tokenfactory/mappings_test.go b/aclmapping/tokenfactory/mappings_test.go index 8edfaf6af0..70792a373d 100644 --- a/aclmapping/tokenfactory/mappings_test.go +++ b/aclmapping/tokenfactory/mappings_test.go @@ -212,7 +212,7 @@ func TestGeneratorInvalidMessageTypes(t *testing.T) { require.Error(t, err) } -func TestMsgBeginBankSendGenerator(t *testing.T) { +func TestMsgBeginBurnDepedencyGenerator(t *testing.T) { priv1 := secp256k1.GenPrivKey() addr1 := sdk.AccAddress(priv1.PubKey().Address()) diff --git a/aclmapping/utils/resource_type.go b/aclmapping/utils/resource_type.go index 5da04b0717..cb0fe3f2cd 100644 --- a/aclmapping/utils/resource_type.go +++ b/aclmapping/utils/resource_type.go @@ -4,6 +4,7 @@ import ( aclsdktypes "github.com/cosmos/cosmos-sdk/types/accesscontrol" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" dextypes "github.com/sei-protocol/sei-chain/x/dex/types" epochtypes "github.com/sei-protocol/sei-chain/x/epoch/types" @@ -31,6 +32,18 @@ var StoreKeyToResourceTypePrefixMap = aclsdktypes.StoreKeyToResourceTypePrefixMa aclsdktypes.ResourceType_KV_AUTH: aclsdktypes.EmptyPrefix, aclsdktypes.ResourceType_KV_AUTH_ADDRESS_STORE: authtypes.AddressStoreKeyPrefix, }, + distributiontypes.StoreKey: { + aclsdktypes.ResourceType_KV_DISTRIBUTION: aclsdktypes.EmptyPrefix, + aclsdktypes.ResourceType_KV_DISTRIBUTION_FEE_POOL: distributiontypes.FeePoolKey, + aclsdktypes.ResourceType_KV_DISTRIBUTION_PROPOSER_KEY: distributiontypes.ProposerKey, + aclsdktypes.ResourceType_KV_DISTRIBUTION_OUTSTANDING_REWARDS: distributiontypes.ValidatorOutstandingRewardsPrefix, + aclsdktypes.ResourceType_KV_DISTRIBUTION_DELEGATOR_WITHDRAW_ADDR: distributiontypes.DelegatorWithdrawAddrPrefix, + aclsdktypes.ResourceType_KV_DISTRIBUTION_DELEGATOR_STARTING_INFO: distributiontypes.DelegatorStartingInfoPrefix, + aclsdktypes.ResourceType_KV_DISTRIBUTION_VAL_HISTORICAL_REWARDS: distributiontypes.ValidatorHistoricalRewardsPrefix, + aclsdktypes.ResourceType_KV_DISTRIBUTION_VAL_CURRENT_REWARDS: distributiontypes.ValidatorCurrentRewardsPrefix, + aclsdktypes.ResourceType_KV_DISTRIBUTION_VAL_ACCUM_COMMISSION: distributiontypes.ValidatorAccumulatedCommissionPrefix, + aclsdktypes.ResourceType_KV_DISTRIBUTION_SLASH_EVENT: distributiontypes.ValidatorSlashEventPrefix, + }, oracletypes.StoreKey: { aclsdktypes.ResourceType_KV_ORACLE: aclsdktypes.EmptyPrefix, aclsdktypes.ResourceType_KV_ORACLE_VOTE_TARGETS: oracletypes.VoteTargetKey, @@ -38,9 +51,22 @@ var StoreKeyToResourceTypePrefixMap = aclsdktypes.StoreKeyToResourceTypePrefixMa aclsdktypes.ResourceType_KV_ORACLE_FEEDERS: oracletypes.FeederDelegationKey, }, stakingtypes.StoreKey: { - aclsdktypes.ResourceType_KV_STAKING: aclsdktypes.EmptyPrefix, - aclsdktypes.ResourceType_KV_STAKING_DELEGATION: stakingtypes.DelegationKey, - aclsdktypes.ResourceType_KV_STAKING_VALIDATOR: stakingtypes.ValidatorsKey, + aclsdktypes.ResourceType_KV_STAKING: aclsdktypes.EmptyPrefix, + aclsdktypes.ResourceType_KV_STAKING_VALIDATION_POWER: stakingtypes.LastValidatorPowerKey, + aclsdktypes.ResourceType_KV_STAKING_TOTAL_POWER: stakingtypes.LastTotalPowerKey, + aclsdktypes.ResourceType_KV_STAKING_VALIDATOR: stakingtypes.ValidatorsKey, + aclsdktypes.ResourceType_KV_STAKING_VALIDATORS_CON_ADDR: stakingtypes.ValidatorsByConsAddrKey, + aclsdktypes.ResourceType_KV_STAKING_VALIDATORS_BY_POWER: stakingtypes.ValidatorsByPowerIndexKey, + aclsdktypes.ResourceType_KV_STAKING_DELEGATION: stakingtypes.DelegationKey, + aclsdktypes.ResourceType_KV_STAKING_UNBONDING_DELEGATION: stakingtypes.UnbondingDelegationKey, + aclsdktypes.ResourceType_KV_STAKING_UNBONDING_DELEGATION_VAL: stakingtypes.UnbondingDelegationByValIndexKey, + aclsdktypes.ResourceType_KV_STAKING_REDELEGATION: stakingtypes.RedelegationKey, + aclsdktypes.ResourceType_KV_STAKING_REDELEGATION_VAL_SRC: stakingtypes.RedelegationByValSrcIndexKey, + aclsdktypes.ResourceType_KV_STAKING_REDELEGATION_VAL_DST: stakingtypes.RedelegationByValDstIndexKey, + aclsdktypes.ResourceType_KV_STAKING_UNBONDING: stakingtypes.UnbondingQueueKey, + aclsdktypes.ResourceType_KV_STAKING_REDELEGATION_QUEUE: stakingtypes.RedelegationQueueKey, + aclsdktypes.ResourceType_KV_STAKING_VALIDATOR_QUEUE: stakingtypes.ValidatorQueueKey, + aclsdktypes.ResourceType_KV_STAKING_HISTORICAL_INFO: stakingtypes.HistoricalInfoKey, }, tokenfactorytypes.StoreKey: { aclsdktypes.ResourceType_KV_TOKENFACTORY: aclsdktypes.EmptyPrefix, diff --git a/app/app.go b/app/app.go index 386eb68f30..02f8c26bad 100644 --- a/app/app.go +++ b/app/app.go @@ -509,6 +509,7 @@ func New( app.keys[acltypes.StoreKey], app.GetSubspace(acltypes.ModuleName), app.AccountKeeper, + app.StakingKeeper, aclOpts..., ) // The last arguments can contain custom message handlers, and custom query handlers, diff --git a/go.mod b/go.mod index 13cc490cb8..6e14e14b52 100644 --- a/go.mod +++ b/go.mod @@ -132,7 +132,7 @@ require ( ) replace ( - github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.1.245 + github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.1.246 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/keybase/go-keychain => github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.1.59 diff --git a/go.sum b/go.sum index b775b82ddb..4774c572f6 100644 --- a/go.sum +++ b/go.sum @@ -1100,8 +1100,8 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/securego/gosec/v2 v2.11.0/go.mod h1:SX8bptShuG8reGC0XS09+a4H2BoWSJi+fscA+Pulbpo= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= -github.com/sei-protocol/sei-cosmos v0.1.245 h1:mOPiwp1ThCapVCVH8mrmXU7ugngLWsiWAftaZ5Ga63U= -github.com/sei-protocol/sei-cosmos v0.1.245/go.mod h1:KPV8lFdD2Ki/M2wZTpfX3LCcuMAZnmcUzYJycjbmOYM= +github.com/sei-protocol/sei-cosmos v0.1.246 h1:qX6ycebWYECnh9DIP9xqCFHVgJ8U4yHuR+asr/vuOVE= +github.com/sei-protocol/sei-cosmos v0.1.246/go.mod h1:KPV8lFdD2Ki/M2wZTpfX3LCcuMAZnmcUzYJycjbmOYM= github.com/sei-protocol/sei-tendermint v0.1.59 h1:POGL60PumMQHF4EzAHzvkGfDnodQJLHpl65LuiwSO/Y= github.com/sei-protocol/sei-tendermint v0.1.59/go.mod h1:Olwbjyagrpoxj5DAUhHxMTWDVEfQ3FYdpypaJ3+6Hs8= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= diff --git a/store/testutils.go b/store/testutils.go index cf73ff0d76..86b0aa59bb 100644 --- a/store/testutils.go +++ b/store/testutils.go @@ -11,7 +11,7 @@ import ( func NewTestKVStore() types.KVStore { mem := dbadapter.Store{DB: dbm.NewMemDB()} - return cachekv.NewStore(mem, nil) + return cachekv.NewStore(mem, storetypes.NewKVStoreKey("test")) } func NewTestCacheMultiStore(stores map[types.StoreKey]types.CacheWrapper) types.CacheMultiStore { diff --git a/x/oracle/simulation/operations.go b/x/oracle/simulation/operations.go index 2028e73625..3988c4b164 100644 --- a/x/oracle/simulation/operations.go +++ b/x/oracle/simulation/operations.go @@ -65,7 +65,7 @@ func WeightedOperations( } // SimulateMsgAggregateExchangeRateVote generates a MsgAggregateExchangeRateVote with random values. -// nolint: funlen +//nolint: funlen func SimulateMsgAggregateExchangeRateVote(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { return func( r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, @@ -122,7 +122,7 @@ func SimulateMsgAggregateExchangeRateVote(ak types.AccountKeeper, bk types.BankK } // SimulateMsgDelegateFeedConsent generates a MsgDelegateFeedConsent with random values. -// nolint: funlen +//nolint: funlen func SimulateMsgDelegateFeedConsent(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { return func( r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string,