Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ go test ./x/photon/keeper/... -run TestMintPhoton -v
**Custom modules (`x/`):**
- `x/gov` — Governance wrapper augmenting Cosmos SDK gov (restricts validator voting via delegation)
- `x/photon` — Photon token minting/burning with fee exceptions
- `x/dynamicfee` — Dynamic fee market calculations (ante + post handlers)
- `x/coredaos` — Core DAO address management (Oversight, Photon DAOs)

Each module follows standard Cosmos SDK structure: `keeper/`, `types/`, `client/cli/`, `ante/` or `post/`, `testutil/`, `module.go`.
Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

### IMPROVEMENTS

- migrate `x/coredaos` away from atomone `x/gov` wrapper [#353](https://github.com/atomone-hub/atomone/pull/353)

## v4.0.0

*Jun 23nd, 2026*
Expand Down
2 changes: 0 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -271,8 +271,6 @@ mockgen_cmd=$(rundep) github.com/golang/mock/mockgen
mocks-gen:
$(mockgen_cmd) -source=x/photon/types/expected_keepers.go -package testutil -destination x/photon/testutil/expected_keepers_mocks.go
$(mockgen_cmd) -source=x/photon/ante/expected_keepers.go -package ante_test -destination x/photon/ante/expected_keepers_mocks_test.go
$(mockgen_cmd) -source=x/dynamicfee/ante/expected_keepers.go -package ante_test -destination x/dynamicfee/ante/expected_keepers_mocks_test.go
$(mockgen_cmd) -source=x/dynamicfee/post/expected_keepers.go -package post_test -destination x/dynamicfee/post/expected_keepers_mocks_test.go
$(mockgen_cmd) -source=x/coredaos/types/expected_keepers.go -package testutil -destination x/coredaos/testutil/expected_keepers_mocks.go

.PHONY: docker-build-debug docker-build-hermes docker-build-all mocks-gen
Expand Down
2 changes: 1 addition & 1 deletion app/keepers/keepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ func NewAppKeeper(
appCodec,
runtime.NewKVStoreService(appKeepers.keys[coredaostypes.StoreKey]),
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
appKeepers.GovKeeperWrapper,
appKeepers.GovKeeper,
appKeepers.StakingKeeper,
)

Expand Down
2 changes: 1 addition & 1 deletion app/modules.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ func appModules(
sdkparams.NewAppModule(app.ParamsKeeper),
consensus.NewAppModule(appCodec, app.ConsensusParamsKeeper),
dynamicfee.NewAppModule(appCodec, *app.DynamicfeeKeeper),
coredaos.NewAppModule(appCodec, *app.CoreDaosKeeper, app.GovKeeperWrapper, app.StakingKeeper, app.AccountKeeper, app.BankKeeper),
coredaos.NewAppModule(appCodec, *app.CoreDaosKeeper, app.GovKeeper, app.StakingKeeper, app.AccountKeeper, app.BankKeeper),
epochs.NewAppModule(&app.EpochsKeeper),

app.TransferModule,
Expand Down
5 changes: 3 additions & 2 deletions x/coredaos/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper"

"github.com/atomone-hub/atomone/x/coredaos/types"
)
Expand All @@ -16,7 +17,7 @@ type Keeper struct {
storeService store.KVStoreService
authority string

govKeeper types.GovKeeper
govKeeper *govkeeper.Keeper
stakingKeeper types.StakingKeeper

Schema collections.Schema
Expand All @@ -27,7 +28,7 @@ func NewKeeper(
cdc codec.BinaryCodec,
storeService store.KVStoreService,
authority string,
govKeeper types.GovKeeper,
govKeeper *govkeeper.Keeper,
stakingKeeper types.StakingKeeper,
) *Keeper {
if _, err := sdk.AccAddressFromBech32(authority); err != nil {
Expand Down
82 changes: 52 additions & 30 deletions x/coredaos/keeper/msg_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ import (
"context"
"fmt"

"cosmossdk.io/collections"
"cosmossdk.io/errors"
"cosmossdk.io/math"

sdk "github.com/cosmos/cosmos-sdk/types"
sdkgovtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"

"github.com/atomone-hub/atomone/x/coredaos/types"
govtypes "github.com/atomone-hub/atomone/x/gov/types"
govtypesv1 "github.com/atomone-hub/atomone/x/gov/types/v1"
)

var _ types.MsgServer = (*MsgServer)(nil)
Expand Down Expand Up @@ -107,17 +107,17 @@ func (ms MsgServer) AnnotateProposal(goCtx context.Context, msg *types.MsgAnnota
return nil, types.ErrInvalidSigner.Wrapf("invalid authority; expected %s, got %s", params.SteeringDaoAddress, msg.Annotator)
}

proposal, found := ms.k.govKeeper.GetProposal(ctx, msg.ProposalId)
if !found {
proposal, err := ms.k.govKeeper.Proposals.Get(ctx, msg.ProposalId)
if err != nil {
logger.Error(
"proposal not found",
"proposal_id", msg.ProposalId,
"authority", msg.Annotator,
)

return nil, govtypes.ErrUnknownProposal.Wrapf("proposal with ID %d not found", msg.ProposalId)
return nil, types.ErrUnknownProposal.Wrapf("proposal with ID %d not found", msg.ProposalId)
}
if proposal.Status != govtypesv1.StatusVotingPeriod {
if proposal.Status != govv1.StatusVotingPeriod {
logger.Error(
"proposal is not in voting period",
"proposal", proposal.Id,
Expand All @@ -140,7 +140,9 @@ func (ms MsgServer) AnnotateProposal(goCtx context.Context, msg *types.MsgAnnota
}

proposal.Annotation = msg.Annotation
ms.k.govKeeper.SetProposal(ctx, proposal)
if err := ms.k.govKeeper.SetProposal(ctx, proposal); err != nil {
return nil, errors.Wrapf(err, "error setting proposal")
}

logger.Info(
"proposal annotated",
Expand Down Expand Up @@ -185,17 +187,17 @@ func (ms MsgServer) EndorseProposal(goCtx context.Context, msg *types.MsgEndorse
return nil, types.ErrInvalidSigner.Wrapf("invalid authority; expected %s, got %s", params.SteeringDaoAddress, msg.Endorser)
}

proposal, found := ms.k.govKeeper.GetProposal(ctx, msg.ProposalId)
if !found {
proposal, err := ms.k.govKeeper.Proposals.Get(ctx, msg.ProposalId)
if err != nil {
logger.Error(
"proposal not found",
"proposal_id", msg.ProposalId,
"authority", msg.Endorser,
)

return nil, govtypes.ErrUnknownProposal.Wrapf("proposal with ID %d not found", msg.ProposalId)
return nil, types.ErrUnknownProposal.Wrapf("proposal with ID %d not found", msg.ProposalId)
}
if proposal.Status != govtypesv1.StatusVotingPeriod {
if proposal.Status != govv1.StatusVotingPeriod {
logger.Error(
"proposal is not in voting period",
"proposal", proposal.Id,
Expand All @@ -216,7 +218,9 @@ func (ms MsgServer) EndorseProposal(goCtx context.Context, msg *types.MsgEndorse
}

proposal.Endorsed = true
ms.k.govKeeper.SetProposal(ctx, proposal)
if err := ms.k.govKeeper.SetProposal(ctx, proposal); err != nil {
return nil, errors.Wrapf(err, "error setting proposal")
}

logger.Info(
"proposal endorsed",
Expand Down Expand Up @@ -274,17 +278,17 @@ func (ms MsgServer) ExtendVotingPeriod(goCtx context.Context, msg *types.MsgExte
return nil, types.ErrInvalidSigner.Wrapf("invalid authority; expected %s, got %s", addressesString, msg.Extender)
}

proposal, found := ms.k.govKeeper.GetProposal(ctx, msg.ProposalId)
if !found {
proposal, err := ms.k.govKeeper.Proposals.Get(ctx, msg.ProposalId)
if err != nil {
logger.Error(
"proposal not found",
"proposal_id", msg.ProposalId,
"authority", msg.Extender,
)

return nil, govtypes.ErrUnknownProposal.Wrapf("proposal with ID %d not found", msg.ProposalId)
return nil, types.ErrUnknownProposal.Wrapf("proposal with ID %d not found", msg.ProposalId)
}
if proposal.Status != govtypesv1.StatusVotingPeriod {
if proposal.Status != govv1.StatusVotingPeriod {
logger.Error(
"proposal is not in voting period",
"proposal", proposal.Id,
Expand All @@ -308,12 +312,18 @@ func (ms MsgServer) ExtendVotingPeriod(goCtx context.Context, msg *types.MsgExte
newEndTime := proposal.VotingEndTime.Add(*params.VotingPeriodExtensionDuration)

// Update ActiveProposalsQueue with new VotingEndTime
ms.k.govKeeper.RemoveFromActiveProposalQueue(ctx, proposal.Id, *proposal.VotingEndTime)
if err := ms.k.govKeeper.ActiveProposalsQueue.Remove(ctx, collections.Join(*proposal.VotingEndTime, proposal.Id)); err != nil {
return nil, errors.Wrapf(err, "error removing proposal from active proposal queue")
}
proposal.VotingEndTime = &newEndTime
ms.k.govKeeper.InsertActiveProposalQueue(ctx, proposal.Id, *proposal.VotingEndTime)
if err := ms.k.govKeeper.ActiveProposalsQueue.Set(ctx, collections.Join(*proposal.VotingEndTime, proposal.Id), proposal.Id); err != nil {
return nil, errors.Wrapf(err, "error inserting proposal into active proposal queue")
}

proposal.TimesVotingPeriodExtended++
ms.k.govKeeper.SetProposal(ctx, proposal)
if err := ms.k.govKeeper.SetProposal(ctx, proposal); err != nil {
return nil, errors.Wrapf(err, "error setting proposal")
}

logger.Info(
"voting period extended",
Expand Down Expand Up @@ -362,17 +372,17 @@ func (ms MsgServer) VetoProposal(goCtx context.Context, msg *types.MsgVetoPropos
return nil, types.ErrInvalidSigner.Wrapf("invalid authority; expected %s, got %s", params.OversightDaoAddress, msg.Vetoer)
}

proposal, found := ms.k.govKeeper.GetProposal(ctx, msg.ProposalId)
if !found {
proposal, err := ms.k.govKeeper.Proposals.Get(ctx, msg.ProposalId)
if err != nil {
logger.Error(
"proposal not found",
"proposal_id", msg.ProposalId,
"authority", msg.Vetoer,
)

return nil, govtypes.ErrUnknownProposal.Wrapf("proposal with ID %d not found", msg.ProposalId)
return nil, types.ErrUnknownProposal.Wrapf("proposal with ID %d not found", msg.ProposalId)
}
if proposal.Status != govtypesv1.StatusVotingPeriod {
if proposal.Status != govv1.StatusVotingPeriod {
logger.Error(
"proposal is not in voting period",
"proposal", proposal.Id,
Expand Down Expand Up @@ -411,23 +421,35 @@ func (ms MsgServer) VetoProposal(goCtx context.Context, msg *types.MsgVetoPropos

// follows the same logic as in x/gov/abci.go for rejected proposals
if msg.BurnDeposit {
ms.k.govKeeper.DeleteAndBurnDeposits(ctx, proposal.Id)
if err := ms.k.govKeeper.DeleteAndBurnDeposits(ctx, proposal.Id); err != nil {
return nil, errors.Wrapf(err, "error deleting and burning deposits")
}
} else {
ms.k.govKeeper.RefundAndDeleteDeposits(ctx, proposal.Id)
if err := ms.k.govKeeper.RefundAndDeleteDeposits(ctx, proposal.Id); err != nil {
return nil, errors.Wrapf(err, "error refunding and deleting deposits")
}
}
proposal.Status = govtypesv1.StatusVetoed
proposal.Status = govv1.StatusVetoed

// Since the proposal is vetoed, we set the final tally result to an empty tally
// and the voting period ends immediately
emptyTally := govtypesv1.EmptyTallyResult()
emptyTally := govv1.EmptyTallyResult()
proposal.FinalTallyResult = &emptyTally
origEndTime := proposal.VotingEndTime
blockTime := ctx.BlockTime()
proposal.VotingEndTime = &blockTime

ms.k.govKeeper.SetProposal(ctx, proposal)
ms.k.govKeeper.DeleteVotes(ctx, proposal.Id)
ms.k.govKeeper.RemoveFromActiveProposalQueue(ctx, proposal.Id, *origEndTime)
if err := ms.k.govKeeper.SetProposal(ctx, proposal); err != nil {
return nil, errors.Wrapf(err, "error setting proposal")
}
// Delete all votes for the proposal. Votes are stored as
// collections.Map[collections.Pair[uint64, sdk.AccAddress], v1.Vote].
if err := ms.k.govKeeper.Votes.Clear(ctx, collections.NewPrefixedPairRange[uint64, sdk.AccAddress](proposal.Id)); err != nil {
return nil, errors.Wrapf(err, "error deleting votes")
}
if err := ms.k.govKeeper.ActiveProposalsQueue.Remove(ctx, collections.Join(*origEndTime, proposal.Id)); err != nil {
return nil, errors.Wrapf(err, "error removing proposal from active proposal queue")
}

ms.k.govKeeper.UpdateMinInitialDeposit(ctx, true)
ms.k.govKeeper.UpdateMinDeposit(ctx, true)
Expand Down
Loading
Loading