Skip to content
Draft
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
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

- Use `TruncateInt` to compute `uphotonToMint` [#250](https://github.com/atomone-hub/atomone/pull/250)
- Fix missing ICA controller configuration [#257](https://github.com/atomone-hub/atomone/pull/257)
- Fix wrapper converters for `x/gov` [#276](https://github.com/atomone-hub/atomone/pull/276)
- Add min-stake filtering for cosmos-sdk votes in the gov ante handler [#279](https://github.com/atomone-hub/atomone/pull/279)

### DEPENDENCIES

Expand All @@ -20,11 +22,14 @@

- Migrate `x/gov` fork from Atom One to Atom One SDK [#248](https://github.com/atomone-hub/atomone/pull/248)
- Add governors to `x/gov` module [#258](https://github.com/atomone-hub/atomone/pull/258)
- Prevent Oversight DAO from vetoing proposals that include a change to the Oversight DAO address [#275](https://github.com/atomone-hub/atomone/pull/275)

### STATE BREAKING

### IMPROVEMENTS

- Reorder ante handlers to verify signatures and deduct fees before doing any tx related stateful checks [#274](https://github.com/atomone-hub/atomone/pull/274)

## v3.0.3

*Oct 20th, 2025*
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
ARG IMG_TAG=latest

# Compile the atomoned binary
FROM golang:1.22-alpine AS atomoned-builder
FROM golang:1.26-alpine AS atomoned-builder
WORKDIR /src/app/
COPY go.mod go.sum* ./
RUN go mod download
Expand Down
9 changes: 9 additions & 0 deletions RELEASES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
# v3.3.0

5868f67ead4585c1bb12413eb25ffe254aecdc8d3d5504697054b2762b5be6d3 atomoned-v3.3.0-darwin-amd64
8aab3a06b6ba5ed58e433c390acac2da8977d6dc545fc59c0ff73f75272a60d0 atomoned-v3.3.0-darwin-arm64
518ba2916da24b0fca3efba8e0e713c81ec3fb1a5fb0b845af61dd76adb1c55c atomoned-v3.3.0-linux-amd64
eb26af28c99732ef59b28a9bfcb8910cd73a04da99866a80dcc67fc5af846441 atomoned-v3.3.0-linux-arm64
f565d6e6cade43c5f4908584664682393473cee0e9e2e7edc8990b0cc76d6237 atomoned-v3.3.0-windows-amd64.exe
8a9fe784f0c7e7d91bc39d14c8f558c06c58d7eefd76055ec0ff267f8b4117cb atomoned-v3.3.0-windows-arm64.exe

# v3.2.0

704ac5d22395c069e4ac025da228ae9307b6b75af0780836333bcd479e4a6852 atomoned-v3.2.0-darwin-amd64
Expand Down
12 changes: 6 additions & 6 deletions ante/ante.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,13 @@ func NewAnteHandler(opts HandlerOptions) (sdk.AnteHandler, error) {
ante.NewExtensionOptionsDecorator(opts.ExtensionOptionChecker),
ante.NewValidateBasicDecorator(),
ante.NewTxTimeoutHeightDecorator(),
ante.NewSetPubKeyDecorator(opts.AccountKeeper), // SetPubKeyDecorator must be called before all signature verification decorators
ante.NewValidateSigCountDecorator(opts.AccountKeeper),
ante.NewSigGasConsumeDecorator(opts.AccountKeeper, sigGasConsumer),
ante.NewSigVerificationDecorator(opts.AccountKeeper, opts.SignModeHandler),
ante.NewIncrementSequenceDecorator(opts.AccountKeeper),
ante.NewValidateMemoDecorator(opts.AccountKeeper),
ante.NewConsumeGasForTxSizeDecorator(opts.AccountKeeper),
NewGovVoteDecorator(opts.Codec, opts.StakingKeeper),
photonante.NewValidateFeeDecorator(opts.PhotonKeeper),
dynamicfeeante.NewDynamicfeeCheckDecorator(
opts.AccountKeeper,
Expand All @@ -78,11 +82,7 @@ func NewAnteHandler(opts HandlerOptions) (sdk.AnteHandler, error) {
opts.TxFeeChecker,
),
),
ante.NewSetPubKeyDecorator(opts.AccountKeeper), // SetPubKeyDecorator must be called before all signature verification decorators
ante.NewValidateSigCountDecorator(opts.AccountKeeper),
ante.NewSigGasConsumeDecorator(opts.AccountKeeper, sigGasConsumer),
ante.NewSigVerificationDecorator(opts.AccountKeeper, opts.SignModeHandler),
ante.NewIncrementSequenceDecorator(opts.AccountKeeper),
NewGovVoteDecorator(opts.Codec, opts.StakingKeeper),
ibcante.NewRedundantRelayDecorator(opts.IBCkeeper),
}

Expand Down
22 changes: 22 additions & 0 deletions ante/gov_vote_ante.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import (
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/authz"
sdkgovv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
sdkgovv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"

Expand Down Expand Up @@ -84,6 +86,26 @@ func (g GovVoteDecorator) ValidateVoteMsgs(ctx sdk.Context, msgs []sdk.Msg) erro
if err != nil {
return err
}
case *sdkgovv1beta1.MsgVote:
accAddr, err = sdk.AccAddressFromBech32(msg.Voter)
if err != nil {
return err
}
case *sdkgovv1.MsgVote:
accAddr, err = sdk.AccAddressFromBech32(msg.Voter)
if err != nil {
return err
}
case *sdkgovv1beta1.MsgVoteWeighted:
accAddr, err = sdk.AccAddressFromBech32(msg.Voter)
if err != nil {
return err
}
case *sdkgovv1.MsgVoteWeighted:
accAddr, err = sdk.AccAddressFromBech32(msg.Voter)
if err != nil {
return err
}
default:
// not a vote message - nothing to validate
return nil
Expand Down
66 changes: 66 additions & 0 deletions ante/gov_vote_ante_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import (

"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkgovv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
sdkgovv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"

"github.com/atomone-hub/atomone/ante"
Expand Down Expand Up @@ -139,6 +141,21 @@ func TestVoteSpamDecoratorGovV1Beta1(t *testing.T) {
} else {
require.Error(t, err, "expected %v to fail", tc.name)
}

// Create sdk vote message
sdkMsg := sdkgovv1beta1.NewMsgVote(
delegator,
0,
sdkgovv1beta1.OptionYes,
)

// Validate sdk vote message
err = decorator.ValidateVoteMsgs(ctx, []sdk.Msg{sdkMsg})
if tc.expectPass {
require.NoError(t, err, "expected %v to pass", tc.name)
} else {
require.Error(t, err, "expected %v to fail", tc.name)
}
}
}

Expand Down Expand Up @@ -264,6 +281,22 @@ func TestVoteWeightedSpamDecoratorGovV1Beta1(t *testing.T) {
} else {
require.Error(t, err, "expected %v to fail", tc.name)
}

sdkWeightedVoteOptions := govv1beta1.ConvertAtomOneWeightedVoteOptionsToSDK(weightedVoteOptions)
// Create sdk vote message
sdkMsg := sdkgovv1beta1.NewMsgVoteWeighted(
delegator,
0,
sdkWeightedVoteOptions,
)

// Validate sdk vote message
err = decorator.ValidateVoteMsgs(ctx, []sdk.Msg{sdkMsg})
if tc.expectPass {
require.NoError(t, err, "expected %v to pass", tc.name)
} else {
require.Error(t, err, "expected %v to fail", tc.name)
}
}
}

Expand Down Expand Up @@ -390,6 +423,22 @@ func TestVoteSpamDecoratorGovV1(t *testing.T) {
} else {
require.Error(t, err, "expected %v to fail", tc.name)
}

// Create sdk vote message
sdkMsg := sdkgovv1.NewMsgVote(
delegator,
0,
sdkgovv1.VoteOption_VOTE_OPTION_YES,
"new-v1-vote-message-test",
)

// Validate sdk vote message
err = decorator.ValidateVoteMsgs(ctx, []sdk.Msg{sdkMsg})
if tc.expectPass {
require.NoError(t, err, "expected %v to pass", tc.name)
} else {
require.Error(t, err, "expected %v to fail", tc.name)
}
}
}

Expand Down Expand Up @@ -517,5 +566,22 @@ func TestVoteWeightedSpamDecoratorGovV1(t *testing.T) {
} else {
require.Error(t, err, "expected %v to fail", tc.name)
}

sdkWeightedVoteOptions := govv1.ConvertAtomOneWeightedVoteOptionsToSDK(weightedVoteOptions)
// Create sdk vote message
sdkMsg := sdkgovv1.NewMsgVoteWeighted(
delegator,
0,
sdkWeightedVoteOptions,
"new-v1-weighted-vote-message-test",
)

// Validate sdk vote message
err = decorator.ValidateVoteMsgs(ctx, []sdk.Msg{sdkMsg})
if tc.expectPass {
require.NoError(t, err, "expected %v to pass", tc.name)
} else {
require.Error(t, err, "expected %v to fail", tc.name)
}
}
}
3 changes: 2 additions & 1 deletion app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,7 @@ func (app *AtomOneApp) setupUpgradeHandlers() {
upgrade.UpgradeName,
upgrade.CreateUpgradeHandler(
app.mm,
app.appCodec,
app.configurator,
&app.AppKeepers,
),
Expand Down Expand Up @@ -531,6 +532,6 @@ func (app *AtomOneApp) GetIBCKeeper() *ibckeeper.Keeper {
type EmptyAppOptions struct{}

// Get implements AppOptions
func (ao EmptyAppOptions) Get(_ string) interface{} {
func (ao EmptyAppOptions) Get(_ string) any {
return nil
}
41 changes: 36 additions & 5 deletions app/keepers/keepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import (
ibctransferkeeper "github.com/cosmos/ibc-go/v10/modules/apps/transfer/keeper"
ibctransfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types"
transferv2 "github.com/cosmos/ibc-go/v10/modules/apps/transfer/v2"
ibcclienttypes "github.com/cosmos/ibc-go/v10/modules/core/02-client/types"
ibcconnectiontypes "github.com/cosmos/ibc-go/v10/modules/core/03-connection/types"
porttypes "github.com/cosmos/ibc-go/v10/modules/core/05-port/types"
ibcapi "github.com/cosmos/ibc-go/v10/modules/core/api"
ibcexported "github.com/cosmos/ibc-go/v10/modules/core/exported"
Expand Down Expand Up @@ -66,6 +68,10 @@ import (
atomonegovkeeper "github.com/atomone-hub/atomone/x/gov/keeper"
photonkeeper "github.com/atomone-hub/atomone/x/photon/keeper"
photontypes "github.com/atomone-hub/atomone/x/photon/types"

ibcprovider "github.com/allinbits/vaas/x/vaas/provider"
ibcproviderkeeper "github.com/allinbits/vaas/x/vaas/provider/keeper"
providertypes "github.com/allinbits/vaas/x/vaas/provider/types"
)

type AppKeepers struct {
Expand Down Expand Up @@ -97,6 +103,7 @@ type AppKeepers struct {
PhotonKeeper *photonkeeper.Keeper
DynamicfeeKeeper *dynamicfeekeeper.Keeper
CoreDaosKeeper *coredaoskeeper.Keeper
ProviderKeeper ibcproviderkeeper.Keeper

// Modules
ICAModule ica.AppModule
Expand All @@ -120,6 +127,7 @@ func NewAppKeeper(
) AppKeepers {
authorityStr := authtypes.NewModuleAddress(govtypes.ModuleName).String()
addressCodec := addresscodec.NewBech32Codec(sdk.GetConfig().GetBech32AccountAddrPrefix())
consAddressCodec := addresscodec.NewBech32Codec(sdk.GetConfig().GetBech32ConsensusAddrPrefix())

appKeepers := AppKeepers{}
// Set keys KVStoreKey, TransientStoreKey, MemoryStoreKey
Expand Down Expand Up @@ -266,6 +274,23 @@ func NewAppKeeper(

appKeepers.GovKeeperWrapper = atomonegovkeeper.NewKeeper(appKeepers.GovKeeper)

appKeepers.ProviderKeeper = ibcproviderkeeper.NewKeeper(
appCodec,
runtime.NewKVStoreService(appKeepers.keys[providertypes.StoreKey]),
appKeepers.IBCKeeper.ChannelKeeper,
appKeepers.IBCKeeper.ConnectionKeeper,
appKeepers.IBCKeeper.ClientKeeper,
appKeepers.StakingKeeper,
appKeepers.SlashingKeeper,
appKeepers.AccountKeeper,
appKeepers.BankKeeper,
*appKeepers.GovKeeper,
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
appCodec.InterfaceRegistry().SigningContext().ValidatorAddressCodec(),
consAddressCodec,
authtypes.FeeCollectorName,
)

appKeepers.CoreDaosKeeper = coredaoskeeper.NewKeeper(
appCodec,
runtime.NewKVStoreService(appKeepers.keys[coredaostypes.StoreKey]),
Expand Down Expand Up @@ -356,14 +381,18 @@ func NewAppKeeper(
icaControllerStack porttypes.IBCModule = icacontroller.NewIBCMiddleware(appKeepers.ICAControllerKeeper)
)

providerModule := ibcprovider.NewAppModule(&appKeepers.ProviderKeeper)

// Create IBC Router & seal
ibcRouter := porttypes.NewRouter().
AddRoute(icahosttypes.SubModuleName, icaHostStack).
AddRoute(icacontrollertypes.SubModuleName, icaControllerStack).
AddRoute(ibctransfertypes.ModuleName, transferStack)
AddRoute(ibctransfertypes.ModuleName, transferStack).
AddRoute(providertypes.ModuleName, providerModule)

ibcv2Router := ibcapi.NewRouter().
AddRoute(ibctransfertypes.PortID, transferStackV2)
AddRoute(ibctransfertypes.PortID, transferStackV2).
AddRoute(providertypes.ModuleName, ibcprovider.NewIBCModuleV2(&appKeepers.ProviderKeeper))

appKeepers.IBCKeeper.SetRouter(ibcRouter)
appKeepers.IBCKeeper.SetRouterV2(ibcv2Router)
Expand Down Expand Up @@ -404,9 +433,11 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino
paramsKeeper.Subspace(distrtypes.ModuleName).WithKeyTable(distrtypes.ParamKeyTable()) //nolint:staticcheck // SA1019
paramsKeeper.Subspace(slashingtypes.ModuleName).WithKeyTable(slashingtypes.ParamKeyTable()) //nolint:staticcheck // SA1019
paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govv1.ParamKeyTable()) //nolint:staticcheck // SA1019
paramsKeeper.Subspace(ibctransfertypes.ModuleName)
paramsKeeper.Subspace(ibcexported.ModuleName)
paramsKeeper.Subspace(icahosttypes.SubModuleName)
paramsKeeper.Subspace(ibctransfertypes.ModuleName).WithKeyTable(ibctransfertypes.ParamKeyTable())
keyTable := ibcclienttypes.ParamKeyTable()
keyTable.RegisterParamSet(&ibcconnectiontypes.Params{})
paramsKeeper.Subspace(ibcexported.ModuleName).WithKeyTable(keyTable)
paramsKeeper.Subspace(icahosttypes.SubModuleName).WithKeyTable(icahosttypes.ParamKeyTable())
paramsKeeper.Subspace(icacontrollertypes.SubModuleName).WithKeyTable(icacontrollertypes.ParamKeyTable())

return paramsKeeper
Expand Down
2 changes: 2 additions & 0 deletions app/keepers/keys.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package keepers

import (
providertypes "github.com/allinbits/vaas/x/vaas/provider/types"
icacontrollertypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller/types"
icahosttypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/host/types"
ibctransfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types"
Expand Down Expand Up @@ -51,6 +52,7 @@ func (appKeepers *AppKeepers) GenerateKeys() {
photontypes.StoreKey,
dynamicfeetypes.StoreKey,
coredaostypes.StoreKey,
providertypes.StoreKey,
)

// Define transient store keys
Expand Down
Loading
Loading