@@ -112,6 +112,7 @@ import (
112112 ibcproviderclient "github.com/cosmos/interchain-security/v5/x/ccv/provider/client"
113113 ibcproviderkeeper "github.com/cosmos/interchain-security/v5/x/ccv/provider/keeper"
114114 providertypes "github.com/cosmos/interchain-security/v5/x/ccv/provider/types"
115+ ccvtypes "github.com/cosmos/interchain-security/v5/x/ccv/types"
115116
116117 "github.com/cosmos/cosmos-sdk/testutil/testdata/testpb"
117118 sigtypes "github.com/cosmos/cosmos-sdk/types/tx/signing"
@@ -125,6 +126,61 @@ const (
125126
126127// this line is used by starport scaffolding # stargate/wasm/app/enabledProposals
127128
129+ // AtomOneGovKeeper wraps the standard SDK gov keeper to behave like AtomOne's gov keeper
130+ // This implements the ccv.GovKeeper interface
131+ type AtomOneGovKeeper struct {
132+ keeper * govkeeper.Keeper
133+ }
134+
135+ // GetProposal implements the AtomOne-style GetProposal method
136+ func (a * AtomOneGovKeeper ) GetProposal (ctx sdk.Context , proposalID uint64 ) (ccvtypes.Proposal , bool ) {
137+ prop , err := a .keeper .Proposals .Get (ctx , proposalID )
138+ if err != nil {
139+ return ccvtypes.Proposal {}, false
140+ }
141+ // Convert SDK proposal to ICS minimal proposal type
142+ return ccvtypes.Proposal {
143+ Messages : prop .Messages ,
144+ }, true
145+ }
146+
147+ // AtomOneGovHooksWrapper wraps ICS provider hooks to work with standard SDK gov module
148+ // This bridges between AtomOne-style hooks (no errors) and SDK hooks (with errors)
149+ type AtomOneGovHooksWrapper struct {
150+ hooks ibcproviderkeeper.Hooks
151+ }
152+
153+ // Implement standard SDK GovHooks interface by wrapping AtomOne-style hooks
154+ func (w AtomOneGovHooksWrapper ) AfterProposalSubmission (ctx context.Context , proposalID uint64 ) error {
155+ sdkCtx := sdk .UnwrapSDKContext (ctx )
156+ w .hooks .AfterProposalSubmission (sdkCtx , proposalID )
157+ return nil
158+ }
159+
160+ func (w AtomOneGovHooksWrapper ) AfterProposalVotingPeriodEnded (ctx context.Context , proposalID uint64 ) error {
161+ sdkCtx := sdk .UnwrapSDKContext (ctx )
162+ w .hooks .AfterProposalVotingPeriodEnded (sdkCtx , proposalID )
163+ return nil
164+ }
165+
166+ func (w AtomOneGovHooksWrapper ) AfterProposalDeposit (ctx context.Context , proposalID uint64 , depositorAddr sdk.AccAddress ) error {
167+ sdkCtx := sdk .UnwrapSDKContext (ctx )
168+ w .hooks .AfterProposalDeposit (sdkCtx , proposalID , depositorAddr )
169+ return nil
170+ }
171+
172+ func (w AtomOneGovHooksWrapper ) AfterProposalVote (ctx context.Context , proposalID uint64 , voterAddr sdk.AccAddress ) error {
173+ sdkCtx := sdk .UnwrapSDKContext (ctx )
174+ w .hooks .AfterProposalVote (sdkCtx , proposalID , voterAddr )
175+ return nil
176+ }
177+
178+ func (w AtomOneGovHooksWrapper ) AfterProposalFailedMinDeposit (ctx context.Context , proposalID uint64 ) error {
179+ sdkCtx := sdk .UnwrapSDKContext (ctx )
180+ w .hooks .AfterProposalFailedMinDeposit (sdkCtx , proposalID )
181+ return nil
182+ }
183+
128184var (
129185 // DefaultNodeHome default home directories for the application daemon
130186 DefaultNodeHome string
@@ -460,6 +516,9 @@ func New(
460516 authtypes .NewModuleAddress (govtypes .ModuleName ).String (),
461517 )
462518
519+ // Create AtomOne-style gov keeper wrapper
520+ atomOneGovKeeper := & AtomOneGovKeeper {keeper : app .GovKeeper }
521+
463522 // IBC v10: scopedKeeper and portKeeper removed from provider keeper initialization
464523 app .ProviderKeeper = ibcproviderkeeper .NewKeeper (
465524 appCodec ,
@@ -473,7 +532,7 @@ func New(
473532 app .AccountKeeper ,
474533 app .DistrKeeper ,
475534 app .BankKeeper ,
476- * app . GovKeeper ,
535+ atomOneGovKeeper ,
477536 authtypes .NewModuleAddress (govtypes .ModuleName ).String (),
478537 authcodec .NewBech32Codec (sdk .GetConfig ().GetBech32ValidatorAddrPrefix ()),
479538 authcodec .NewBech32Codec (sdk .GetConfig ().GetBech32ConsensusAddrPrefix ()),
@@ -490,8 +549,9 @@ func New(
490549 // Set legacy router for backwards compatibility with gov v1beta1
491550 app .GovKeeper .SetLegacyRouter (govRouter )
492551
552+ // Use the AtomOne hooks wrapper to bridge between the two interfaces
493553 app .GovKeeper = app .GovKeeper .SetHooks (
494- govtypes .NewMultiGovHooks (app .ProviderKeeper .Hooks ()),
554+ govtypes .NewMultiGovHooks (AtomOneGovHooksWrapper { hooks : app .ProviderKeeper .Hooks ()} ),
495555 )
496556
497557 providerModule := ibcprovider .NewAppModule (& app .ProviderKeeper , app .GetSubspace (providertypes .ModuleName ))
0 commit comments