From dd41c730cf74808d2b50861684b1dc6671a7dede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CDongLieu=E2=80=9D?= Date: Mon, 16 Sep 2024 20:30:32 +0700 Subject: [PATCH] module dao for app --- app/app.go | 26 +----- app/keepers/keeper.go | 137 ++++++++++++++++++++++++++------ app/keepers/keys.go | 4 + app/module.go | 16 ++++ x/dao/abci.go | 7 +- x/dao/keeper/delegation.go | 39 ++++++--- x/dao/keeper/keeper.go | 1 - x/dao/keeper/mint.go | 7 +- x/dao/keeper/reward.go | 11 ++- x/dao/keeper/treasury.go | 5 +- x/dao/keeper/voting.go | 14 ++-- x/dao/types/expected_keepers.go | 21 ++--- 12 files changed, 203 insertions(+), 85 deletions(-) diff --git a/app/app.go b/app/app.go index 6e9fd098..b99ccc74 100644 --- a/app/app.go +++ b/app/app.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "io" + "net/http" "os" "path/filepath" @@ -76,8 +77,7 @@ import ( v1_1_1 "github.com/onomyprotocol/onomy/app/upgrades/v1.1.1" v1_1_2 "github.com/onomyprotocol/onomy/app/upgrades/v1.1.2" v1_1_4 "github.com/onomyprotocol/onomy/app/upgrades/v1.1.4" - // "github.com/onomyprotocol/onomy/docs" - // "github.com/onomyprotocol/onomy/x/dao" + "github.com/onomyprotocol/onomy/docs" // daoclient "github.com/onomyprotocol/onomy/x/dao/client" // daokeeper "github.com/onomyprotocol/onomy/x/dao/keeper" // daotypes "github.com/onomyprotocol/onomy/x/dao/types" @@ -90,26 +90,6 @@ const ( AppName = "onomy" ) -// func getGovProposalHandlers() []govclient.ProposalHandler { -// var govProposalHandlers []govclient.ProposalHandler - -// govProposalHandlers = append(govProposalHandlers, -// paramsclient.ProposalHandler, -// distrclient.ProposalHandler, -// upgradeclient.ProposalHandler, -// upgradeclient.CancelProposalHandler, -// ibcclientclient.UpdateClientProposalHandler, -// ibcclientclient.UpgradeProposalHandler, -// daoclient.FundTreasuryProposalHandler, -// daoclient.ExchangeWithTreasuryProposalProposalHandler, -// ibcproviderclient.ConsumerAdditionProposalHandler, -// ibcproviderclient.ConsumerRemovalProposalHandler, -// ibcproviderclient.EquivocationProposalHandler, -// ) - -// return govProposalHandlers -// } - var ( // DefaultNodeHome default home directories for the application daemon. DefaultNodeHome string // nolint:gochecknoglobals // cosmos-sdk application style @@ -488,6 +468,8 @@ func (app *OnomyApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIC if err := server.RegisterSwaggerAPI(apiSvr.ClientCtx, apiSvr.Router, apiConfig.Swagger); err != nil { panic(err) } + // register app's OpenAPI routes. + apiSvr.Router.Handle("/openapi/openapi.yml", http.FileServer(http.FS(docs.Docs))) } // RegisterTxService implements the Application.RegisterTxService method. diff --git a/app/keepers/keeper.go b/app/keepers/keeper.go index e7ba6c1b..326594d6 100644 --- a/app/keepers/keeper.go +++ b/app/keepers/keeper.go @@ -47,7 +47,7 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" capabilitykeeper "github.com/cosmos/ibc-go/modules/capability/keeper" capabilitytypes "github.com/cosmos/ibc-go/modules/capability/types" - + "github.com/cosmos/ibc-go/v8/modules/apps/transfer" ibctransfertypes "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types" ibcclienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" ibcconnectiontypes "github.com/cosmos/ibc-go/v8/modules/core/03-connection/types" @@ -55,7 +55,14 @@ import ( ibckeeper "github.com/cosmos/ibc-go/v8/modules/core/keeper" ibctransferkeeper "github.com/cosmos/ibc-go/v8/modules/apps/transfer/keeper" + porttypes "github.com/cosmos/ibc-go/v8/modules/core/05-port/types" + icsprovider "github.com/cosmos/interchain-security/v5/x/ccv/provider" icsproviderkeeper "github.com/cosmos/interchain-security/v5/x/ccv/provider/keeper" + providertypes "github.com/cosmos/interchain-security/v5/x/ccv/provider/types" + + "github.com/onomyprotocol/onomy/x/dao" + daokeeper "github.com/onomyprotocol/onomy/x/dao/keeper" + daotypes "github.com/onomyprotocol/onomy/x/dao/types" ) type AppKeepers struct { @@ -65,34 +72,35 @@ type AppKeepers struct { memKeys map[string]*storetypes.MemoryStoreKey // keepers - AccountKeeper authkeeper.AccountKeeper - BankKeeper bankkeeper.Keeper - CapabilityKeeper *capabilitykeeper.Keeper - StakingKeeper *stakingkeeper.Keeper - SlashingKeeper slashingkeeper.Keeper - MintKeeper mintkeeper.Keeper - DistrKeeper distrkeeper.Keeper - GovKeeper *govkeeper.Keeper - CrisisKeeper *crisiskeeper.Keeper - UpgradeKeeper *upgradekeeper.Keeper - ParamsKeeper paramskeeper.Keeper - + AccountKeeper authkeeper.AccountKeeper + BankKeeper bankkeeper.Keeper + CapabilityKeeper *capabilitykeeper.Keeper + StakingKeeper *stakingkeeper.Keeper + SlashingKeeper slashingkeeper.Keeper + MintKeeper mintkeeper.Keeper + DistrKeeper distrkeeper.Keeper + GovKeeper *govkeeper.Keeper + CrisisKeeper *crisiskeeper.Keeper + UpgradeKeeper *upgradekeeper.Keeper + ParamsKeeper paramskeeper.Keeper EvidenceKeeper evidencekeeper.Keeper FeeGrantKeeper feegrantkeeper.Keeper AuthzKeeper authzkeeper.Keeper ConsensusParamsKeeper consensusparamkeeper.Keeper - - IBCKeeper *ibckeeper.Keeper + IBCKeeper *ibckeeper.Keeper + TransferKeeper ibctransferkeeper.Keeper + ProviderKeeper icsproviderkeeper.Keeper // make scoped keepers public for test purposes - ScopedIBCKeeper capabilitykeeper.ScopedKeeper - ScopedTransferKeeper capabilitykeeper.ScopedKeeper - - // - TransferKeeper ibctransferkeeper.Keeper - ProviderKeeper icsproviderkeeper.Keeper - ScopedIBCProviderKeeper capabilitykeeper.ScopedKeeper - // DaoKeeper daokeeper.Keeper + ScopedIBCKeeper capabilitykeeper.ScopedKeeper + ScopedTransferKeeper capabilitykeeper.ScopedKeeper + ScopedICSproviderkeeper capabilitykeeper.ScopedKeeper + + // Modules + TransferModule transfer.AppModule + ProviderModule icsprovider.AppModule + + DaoKeeper daokeeper.Keeper } func NewAppKeeper( @@ -149,6 +157,7 @@ func NewAppKeeper( appKeepers.ScopedIBCKeeper = appKeepers.CapabilityKeeper.ScopeToModule(ibcexported.ModuleName) appKeepers.ScopedTransferKeeper = appKeepers.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) + appKeepers.ScopedICSproviderkeeper = appKeepers.CapabilityKeeper.ScopeToModule(providertypes.ModuleName) // Applications that wish to enforce statically created ScopedKeepers should call `Seal` after creating // their scoped modules in `NewApp` with `ScopeToModule` @@ -231,9 +240,16 @@ func NewAppKeeper( stakingtypes.NewMultiStakingHooks( appKeepers.DistrKeeper.Hooks(), appKeepers.SlashingKeeper.Hooks(), + appKeepers.ProviderKeeper.Hooks(), ), ) + // protect the dao module form the slashing + appKeepers.StakingKeeper = appKeepers.StakingKeeper.SetSlashingProtestedModules(func() map[string]struct{} { + return map[string]struct{}{ + daotypes.ModuleName: {}, + } + }) // UpgradeKeeper must be created before IBCKeeper appKeepers.UpgradeKeeper = upgradekeeper.NewKeeper( skipUpgradeHeights, @@ -255,6 +271,27 @@ func NewAppKeeper( authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) + appKeepers.ProviderKeeper = icsproviderkeeper.NewKeeper( + appCodec, + appKeepers.keys[providertypes.StoreKey], + appKeepers.GetSubspace(providertypes.ModuleName), + appKeepers.ScopedICSproviderkeeper, + appKeepers.IBCKeeper.ChannelKeeper, + appKeepers.IBCKeeper.PortKeeper, + appKeepers.IBCKeeper.ConnectionKeeper, + appKeepers.IBCKeeper.ClientKeeper, + appKeepers.StakingKeeper, + appKeepers.SlashingKeeper, + appKeepers.AccountKeeper, + appKeepers.DistrKeeper, + appKeepers.BankKeeper, + govkeeper.Keeper{}, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + authcodec.NewBech32Codec(sdk.GetConfig().GetBech32ValidatorAddrPrefix()), + authcodec.NewBech32Codec(sdk.GetConfig().GetBech32ConsensusAddrPrefix()), + authtypes.FeeCollectorName, + ) + // gov depends on provider, so needs to be set after govConfig := govtypes.DefaultConfig() // set the MaxMetadataLen for proposals to the same value as it was pre-sdk v0.47.x @@ -283,7 +320,20 @@ func NewAppKeeper( authtypes.FeeCollectorName, authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) + ibcmodule := transfer.NewIBCModule(appKeepers.TransferKeeper) + // appKeepers.ProviderKeeper.SetGovKeeper(*appKeepers.GovKeeper) + + appKeepers.ProviderModule = icsprovider.NewAppModule( + &appKeepers.ProviderKeeper, + appKeepers.GetSubspace(providertypes.ModuleName), + ) + + // Create static IBC router, add transfer route, then set and seal it + ibcRouter := porttypes.NewRouter() + ibcRouter.AddRoute(ibctransfertypes.ModuleName, ibcmodule) + ibcRouter.AddRoute(providertypes.ModuleName, appKeepers.ProviderModule) + appKeepers.IBCKeeper.SetRouter(ibcRouter) // Register the proposal types // Deprecated: Avoid adding new handlers, instead use the new proposal flow // by granting the governance module the right to execute the message. @@ -291,11 +341,19 @@ func NewAppKeeper( govRouter := govv1beta1.NewRouter() govRouter. AddRoute(govtypes.RouterKey, govv1beta1.ProposalHandler). - AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(appKeepers.ParamsKeeper)) + AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(appKeepers.ParamsKeeper)). + AddRoute(daotypes.RouterKey, dao.NewProposalHandler(appKeepers.DaoKeeper)). + AddRoute(providertypes.RouterKey, icsprovider.NewProviderProposalHandler(appKeepers.ProviderKeeper)) // Set legacy router for backwards compatibility with gov v1beta1 appKeepers.GovKeeper.SetLegacyRouter(govRouter) + appKeepers.GovKeeper = appKeepers.GovKeeper.SetHooks( + govtypes.NewMultiGovHooks( + appKeepers.ProviderKeeper.Hooks(), + ), + ) + evidenceKeeper := evidencekeeper.NewKeeper( appCodec, runtime.NewKVStoreService(appKeepers.keys[evidencetypes.StoreKey]), @@ -305,6 +363,34 @@ func NewAppKeeper( runtime.ProvideCometInfoService(), ) + appKeepers.TransferKeeper = ibctransferkeeper.NewKeeper( + appCodec, + appKeepers.keys[ibctransfertypes.StoreKey], + appKeepers.GetSubspace(ibctransfertypes.ModuleName), + appKeepers.IBCKeeper.ChannelKeeper, + appKeepers.IBCKeeper.ChannelKeeper, + appKeepers.IBCKeeper.PortKeeper, + appKeepers.AccountKeeper, + appKeepers.BankKeeper, + appKeepers.ScopedTransferKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + ) + + appKeepers.TransferModule = transfer.NewAppModule(appKeepers.TransferKeeper) + + appKeepers.DaoKeeper = *daokeeper.NewKeeper( + appCodec, + runtime.NewKVStoreService(appKeepers.keys[daotypes.StoreKey]), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + appKeepers.GetSubspace(daotypes.ModuleName), + appKeepers.BankKeeper, + appKeepers.AccountKeeper, + appKeepers.DistrKeeper, + appKeepers.GovKeeper, + appKeepers.MintKeeper, + appKeepers.StakingKeeper, + ) + // If evidence needs to be handled for the app, set routes in router here and seal appKeepers.EvidenceKeeper = *evidenceKeeper @@ -336,6 +422,9 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govv1.ParamKeyTable()) //nolint: staticcheck // SA1019 paramsKeeper.Subspace(crisistypes.ModuleName).WithKeyTable(crisistypes.ParamKeyTable()) //nolint: staticcheck // SA1019 paramsKeeper.Subspace(ibcexported.ModuleName).WithKeyTable(keyTable) + paramsKeeper.Subspace(ibctransfertypes.ModuleName).WithKeyTable(ibctransfertypes.ParamKeyTable()) + paramsKeeper.Subspace(providertypes.ModuleName).WithKeyTable(providertypes.ParamKeyTable()) + paramsKeeper.Subspace(daotypes.ModuleName) return paramsKeeper } diff --git a/app/keepers/keys.go b/app/keepers/keys.go index e3ebefba..f7e504e1 100644 --- a/app/keepers/keys.go +++ b/app/keepers/keys.go @@ -24,6 +24,8 @@ import ( paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + providertypes "github.com/cosmos/interchain-security/v5/x/ccv/provider/types" + daotypes "github.com/onomyprotocol/onomy/x/dao/types" ) func (appKeepers *AppKeepers) GenerateKeys() { @@ -49,6 +51,8 @@ func (appKeepers *AppKeepers) GenerateKeys() { capabilitytypes.StoreKey, feegrant.StoreKey, authzkeeper.StoreKey, + providertypes.StoreKey, + daotypes.StoreKey, consensusparamtypes.StoreKey, ) diff --git a/app/module.go b/app/module.go index 32ff80df..ec7d480d 100644 --- a/app/module.go +++ b/app/module.go @@ -49,12 +49,16 @@ import ( ibc "github.com/cosmos/ibc-go/v8/modules/core" ibcexported "github.com/cosmos/ibc-go/v8/modules/core/exported" providertypes "github.com/cosmos/interchain-security/v5/x/ccv/provider/types" + + "github.com/onomyprotocol/onomy/x/dao" + daotypes "github.com/onomyprotocol/onomy/x/dao/types" ) var ( // module account permissions. maccPerms = map[string][]string{ // nolint:gochecknoglobals // cosmos-sdk application style authtypes.FeeCollectorName: nil, + daotypes.ModuleName: {authtypes.Minter}, distrtypes.ModuleName: nil, minttypes.ModuleName: {authtypes.Minter}, stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, @@ -67,6 +71,7 @@ var ( // module accounts that are allowed to receive tokens. allowedReceivingModAcc = map[string]bool{ // nolint:gochecknoglobals // cosmos-sdk application style distrtypes.ModuleName: true, + daotypes.ModuleName: true, // provider chain note: the fee-pool is allowed to receive tokens authtypes.FeeCollectorName: true, } @@ -82,6 +87,7 @@ func appModules( auth.NewAppModule(appCodec, app.AccountKeeper, nil, app.GetSubspace(authtypes.ModuleName)), vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)), + dao.NewAppModule(appCodec, app.DaoKeeper), capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), crisis.NewAppModule(app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(govtypes.ModuleName)), @@ -97,6 +103,8 @@ func appModules( consensus.NewAppModule(appCodec, app.ConsensusParamsKeeper), staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName)), genutil.NewAppModule(app.AccountKeeper, app.StakingKeeper, app, txConfig), + app.ProviderModule, + app.TransferModule, // and } @@ -110,6 +118,8 @@ func newBasicManagerFromManager(app *OnomyApp) module.BasicManager { govtypes.ModuleName: gov.NewAppModuleBasic( []govclient.ProposalHandler{ paramsclient.ProposalHandler, + dao.FundTreasuryProposalHandler, + dao.ExchangeWithTreasuryProposalProposalHandler, }, ), }) @@ -142,6 +152,7 @@ func orderBeginBlockers() []string { consensusparamtypes.ModuleName, providertypes.ModuleName, // and + daotypes.ModuleName, } } @@ -170,6 +181,7 @@ func orderEndBlockers() []string { consensusparamtypes.ModuleName, providertypes.ModuleName, // and + daotypes.ModuleName, } } @@ -197,6 +209,7 @@ func orderInitBlockers() []string { consensusparamtypes.ModuleName, crisistypes.ModuleName, providertypes.ModuleName, + daotypes.ModuleName, } } @@ -208,6 +221,7 @@ func simulationModules( return []module.AppModuleSimulation{ auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)), + dao.NewAppModule(appCodec, app.DaoKeeper), capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(govtypes.ModuleName)), @@ -219,5 +233,7 @@ func simulationModules( evidence.NewAppModule(app.EvidenceKeeper), authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), ibc.NewAppModule(app.IBCKeeper), + app.ProviderModule, + app.TransferModule, } } diff --git a/x/dao/abci.go b/x/dao/abci.go index 4545e4b6..e38d7e4d 100644 --- a/x/dao/abci.go +++ b/x/dao/abci.go @@ -19,8 +19,13 @@ func BeginBlocker(ctx context.Context, k keeper.Keeper) { // EndBlocker calls the dao re-balancing every block. func EndBlocker(ctx context.Context, k keeper.Keeper) { // defer telemetry.ModuleMeasureSince(types.ModuleName, time.Now(), telemetry.MetricKeyEndBlocker) + totalStakingSupply, err := k.GetDaoDelegationSupply(ctx) + if err != nil { + k.Logger(ctx).Error("dao EndBlocker error: %v", err) + debug.PrintStack() + } - if k.GetDaoDelegationSupply(ctx).GT(math.LegacyZeroDec()) { + if totalStakingSupply.GT(math.LegacyZeroDec()) { if err := k.VoteAbstain(ctx); err != nil { k.Logger(ctx).Error("dao EndBlocker error: %v", err) debug.PrintStack() diff --git a/x/dao/keeper/delegation.go b/x/dao/keeper/delegation.go index fbf1ed07..257583b5 100644 --- a/x/dao/keeper/delegation.go +++ b/x/dao/keeper/delegation.go @@ -14,7 +14,10 @@ import ( // ReBalanceDelegation re-balances the DAO staking among validators bases on the current validators self bond. func (k Keeper) ReBalanceDelegation(ctx sdk.Context) error { daoAddr := k.accountKeeper.GetModuleAddress(types.ModuleName) - vals := k.stakingKeeper.GetAllValidators(ctx) + vals, err := k.stakingKeeper.GetAllValidators(ctx) + if err != nil { + return err + } targetDaoStaking := k.getTargetDelegationState(ctx, vals) delegations, undelegations := k.computeDelegationsAndUndelegation(ctx, daoAddr, vals, targetDaoStaking) @@ -29,7 +32,10 @@ func (k Keeper) ReBalanceDelegation(ctx sdk.Context) error { return err } - vals = k.stakingKeeper.GetAllValidators(ctx) + vals, err = k.stakingKeeper.GetAllValidators(ctx) + if err != nil { + return err + } targetDaoStaking = k.getTargetDelegationState(ctx, vals) delegations, undelegations = k.computeDelegationsAndUndelegation(ctx, daoAddr, vals, targetDaoStaking) @@ -41,8 +47,12 @@ func (k Keeper) ReBalanceDelegation(ctx sdk.Context) error { } // GetDaoDelegationSupply returns total amount of the treasury bonded coins. -func (k Keeper) GetDaoDelegationSupply(ctx context.Context) math.LegacyDec { - return k.getDaoDelegationSupply(ctx, k.stakingKeeper.GetAllValidators(ctx)) +func (k Keeper) GetDaoDelegationSupply(ctx context.Context) (math.LegacyDec, error) { + vals, err := k.stakingKeeper.GetAllValidators(ctx) + if err != nil { + return math.LegacyZeroDec(), err + } + return k.getDaoDelegationSupply(ctx, vals), nil } // getTargetDelegationState builds a map of the validators and the stake amount they should have now. @@ -64,8 +74,8 @@ func (k Keeper) getTargetDelegationState(ctx sdk.Context, vals []stakingtypes.Va panic(err) } accVal := sdk.AccAddress(valAddr) - selfDelegation, found := k.stakingKeeper.GetDelegation(ctx, accVal, valAddr) - if !found || selfDelegation.GetShares().IsZero() { + selfDelegation, err := k.stakingKeeper.GetDelegation(ctx, accVal, valAddr) + if err != nil || selfDelegation.GetShares().IsZero() { continue } selfDelegationAmount := val.TokensFromShares(selfDelegation.GetShares()) @@ -99,8 +109,8 @@ func (k Keeper) getDaoDelegationSupply(ctx context.Context, vals []stakingtypes. if err != nil { panic(err) } - delegation, found := k.stakingKeeper.GetDelegation(ctx, daoAddr, valAddr) - if !found || delegation.GetShares().IsZero() { + delegation, err := k.stakingKeeper.GetDelegation(ctx, daoAddr, valAddr) + if err != nil || delegation.GetShares().IsZero() { continue } delegationAmount := val.TokensFromShares(delegation.GetShares()) @@ -126,8 +136,8 @@ func (k Keeper) computeDelegationsAndUndelegation( } targetDaoDelegation, ok := targetDaoStaking[valAddr.String()] delegatedByDao := math.ZeroInt() - delegation, found := k.stakingKeeper.GetDelegation(ctx, daoAddr, valAddr) - if found { + delegation, err := k.stakingKeeper.GetDelegation(ctx, daoAddr, valAddr) + if err == nil { delegatedByDao = val.TokensFromShares(delegation.GetShares()).TruncateInt() } // for the validators not in the target list the target amount is zero @@ -187,7 +197,10 @@ func undelegateValidators(ctx sdk.Context, vals []stakingtypes.Validator, undele func (k Keeper) UndelegateAllValidators(ctx context.Context) (err error) { daoAddr := k.accountKeeper.GetModuleAddress(types.ModuleName) - vals := k.stakingKeeper.GetAllValidators(ctx) + vals, err := k.stakingKeeper.GetAllValidators(ctx) + if err != nil { + return err + } for _, val := range vals { valAddr, err := sdk.ValAddressFromBech32(val.GetOperator()) @@ -195,8 +208,8 @@ func (k Keeper) UndelegateAllValidators(ctx context.Context) (err error) { return err } - delegation, found := k.stakingKeeper.GetDelegation(ctx, daoAddr, valAddr) - if !found || delegation.GetShares().IsZero() { + delegation, err := k.stakingKeeper.GetDelegation(ctx, daoAddr, valAddr) + if err != nil || delegation.GetShares().IsZero() { continue } diff --git a/x/dao/keeper/keeper.go b/x/dao/keeper/keeper.go index 74ae2a17..c893bb41 100644 --- a/x/dao/keeper/keeper.go +++ b/x/dao/keeper/keeper.go @@ -19,7 +19,6 @@ type ( cdc codec.BinaryCodec storeService store.KVStoreService - logger log.Logger authority string diff --git a/x/dao/keeper/mint.go b/x/dao/keeper/mint.go index 933050f2..f3ba8016 100644 --- a/x/dao/keeper/mint.go +++ b/x/dao/keeper/mint.go @@ -12,8 +12,11 @@ import ( func (k Keeper) InflateDao(ctx context.Context) (err error) { daoAddr := k.accountKeeper.GetModuleAddress(types.ModuleName) daoBalance := k.bankKeeper.GetBalance(ctx, daoAddr, "anom") - minter := k.mintKeeper.GetMinter(ctx) - params := k.mintKeeper.GetParams(ctx) + + sdkCtx := sdk.UnwrapSDKContext(ctx) + genesis := k.mintKeeper.ExportGenesis(sdkCtx) + minter := genesis.Minter + params := genesis.Params minter.AnnualProvisions = minter.NextAnnualProvisions(params, daoBalance.Amount) // mint coins, update supply diff --git a/x/dao/keeper/reward.go b/x/dao/keeper/reward.go index f59dcfe9..e4839105 100644 --- a/x/dao/keeper/reward.go +++ b/x/dao/keeper/reward.go @@ -11,7 +11,10 @@ import ( // WithdrawReward withdraw dao delegation reward. func (k Keeper) WithdrawReward(ctx context.Context) error { - vals := k.stakingKeeper.GetAllValidators(ctx) + vals, err := k.stakingKeeper.GetAllValidators(ctx) + if err != nil { + return err + } daoAddr := k.accountKeeper.GetModuleAddress(types.ModuleName) for _, val := range vals { valOperator := val.GetOperator() @@ -19,12 +22,12 @@ func (k Keeper) WithdrawReward(ctx context.Context) error { if err != nil { return err } - _, found := k.stakingKeeper.GetDelegation(ctx, daoAddr, valAddr) - if !found { + _, err = k.stakingKeeper.GetDelegation(ctx, daoAddr, valAddr) + if err != nil { continue } // check existence of delegator starting info - if !k.distributionKeeper.HasDelegatorStartingInfo(ctx, valAddr, daoAddr) { + if has, err := k.distributionKeeper.HasDelegatorStartingInfo(ctx, valAddr, daoAddr); err != nil || !has { continue } diff --git a/x/dao/keeper/treasury.go b/x/dao/keeper/treasury.go index 86d9b8db..ae9f684c 100644 --- a/x/dao/keeper/treasury.go +++ b/x/dao/keeper/treasury.go @@ -13,7 +13,10 @@ func (k Keeper) Treasury(ctx sdk.Context) sdk.Coins { } func (k Keeper) treasuryBondDenomAmount(ctx sdk.Context) math.Int { - denom := k.stakingKeeper.BondDenom(ctx) + denom, err := k.stakingKeeper.BondDenom(ctx) + if err != nil { + panic(err) + } return k.treasury(ctx).AmountOf(denom) } diff --git a/x/dao/keeper/voting.go b/x/dao/keeper/voting.go index 38b4f715..1c1574ca 100644 --- a/x/dao/keeper/voting.go +++ b/x/dao/keeper/voting.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + "github.com/cosmos/cosmos-sdk/x/gov/types/v1" "github.com/onomyprotocol/onomy/x/dao/types" ) @@ -12,18 +12,18 @@ import ( // VoteAbstain votes abstain on all the proposals from the DAO account. func (k Keeper) VoteAbstain(ctx context.Context) (err error) { daoAddr := k.accountKeeper.GetModuleAddress(types.ModuleName) - k.govKeeper.IterateProposals(ctx, func(proposal govtypes.Proposal) bool { - if proposal.Status != govtypes.StatusVotingPeriod { + k.govKeeper.IterateProposals(ctx, func(proposal v1.Proposal) bool { + if proposal.Status != v1.StatusVotingPeriod { return false } - _, found := k.govKeeper.GetVote(ctx, proposal.ProposalId, daoAddr) + _, err := k.govKeeper.GetVote(ctx, proposal.Id, daoAddr) // the dao should vote now - if !found { - err = k.govKeeper.AddVote(ctx, proposal.ProposalId, daoAddr, govtypes.NewNonSplitVoteOption(govtypes.OptionAbstain)) + if err != nil { + err = k.govKeeper.AddVote(ctx, proposal.Id, daoAddr, v1.NewNonSplitVoteOption(v1.OptionAbstain), "") if err != nil { return true } - k.Logger(ctx).Info(fmt.Sprintf("voted abstain on proposal[%d]: %s", proposal.ProposalId, proposal.GetTitle())) + k.Logger(ctx).Info(fmt.Sprintf("voted abstain on proposal[%d]: %s", proposal.Id, proposal.GetTitle())) } return false }) diff --git a/x/dao/types/expected_keepers.go b/x/dao/types/expected_keepers.go index 75e3b085..91e1fb49 100644 --- a/x/dao/types/expected_keepers.go +++ b/x/dao/types/expected_keepers.go @@ -10,7 +10,9 @@ import ( paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + // govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + // govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ) // ParamSubspace defines the expected Subspace interface. @@ -40,28 +42,27 @@ type BankKeeper interface { // DistributionKeeper expected distribution keeper. type DistributionKeeper interface { - HasDelegatorStartingInfo(context.Context, sdk.ValAddress, sdk.AccAddress) bool + HasDelegatorStartingInfo(context.Context, sdk.ValAddress, sdk.AccAddress) (bool, error) WithdrawDelegationRewards(context.Context, sdk.AccAddress, sdk.ValAddress) (sdk.Coins, error) } // GovKeeper expected gov keeper. type GovKeeper interface { - AddVote(context.Context, uint64, sdk.AccAddress, govtypes.WeightedVoteOptions) error - GetVote(context.Context, uint64, sdk.AccAddress) (govtypes.Vote, bool) - IterateProposals(context.Context, func(proposal govtypes.Proposal) bool) + AddVote(context.Context, uint64, sdk.AccAddress, v1.WeightedVoteOptions, string) error + GetVote(context.Context, uint64, sdk.AccAddress) (v1.Vote, error) + IterateProposals(context.Context, func(v v1.Proposal) bool) error } // MintKeeper expected mint keeper. type MintKeeper interface { - GetMinter(ctx context.Context) (minter minttypes.Minter) - GetParams(ctx context.Context) (params minttypes.Params) + ExportGenesis(ctx sdk.Context) *minttypes.GenesisState } // StakingKeeper expected staking keeper. type StakingKeeper interface { - BondDenom(context.Context) string + BondDenom(context.Context) (string, error) Delegate(context.Context, sdk.AccAddress, math.Int, stakingtypes.BondStatus, stakingtypes.Validator, bool) (math.LegacyDec, error) - GetDelegation(context.Context, sdk.AccAddress, sdk.ValAddress) (stakingtypes.Delegation, bool) - GetAllValidators(context.Context) []stakingtypes.Validator + GetDelegation(context.Context, sdk.AccAddress, sdk.ValAddress) (stakingtypes.Delegation, error) + GetAllValidators(context.Context) ([]stakingtypes.Validator, error) UnbondAndUndelegateCoins(context.Context, sdk.AccAddress, sdk.ValAddress, math.LegacyDec) (math.Int, error) }