From 340d42aba3991571dd2a4e5ca62b71771a46d40d Mon Sep 17 00:00:00 2001 From: Giuseppe Natale <12249307+giunatale@users.noreply.github.com> Date: Thu, 19 Mar 2026 11:05:52 +0100 Subject: [PATCH 1/4] oversight DAO and steering DAO cannot be the same --- x/coredaos/types/params.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/x/coredaos/types/params.go b/x/coredaos/types/params.go index dea3ebcff..a3337a579 100644 --- a/x/coredaos/types/params.go +++ b/x/coredaos/types/params.go @@ -56,6 +56,11 @@ func (p Params) ValidateBasic() error { } } + // Oversight DAO cannot be the same as the Steering DAO + if p.SteeringDaoAddress != "" && p.OversightDaoAddress != "" && p.SteeringDaoAddress == p.OversightDaoAddress { + return fmt.Errorf("steering DAO address and oversight DAO address cannot be the same: %s", p.SteeringDaoAddress) + } + // VotingPeriodExtensionDuration must be a positive duration if p.VotingPeriodExtensionDuration == nil { return fmt.Errorf("voting period extension duration must not be nil") From 8b0ede4a5eba2c5c45e136a7f19959b5177454e0 Mon Sep 17 00:00:00 2001 From: Giuseppe Natale <12249307+giunatale@users.noreply.github.com> Date: Thu, 19 Mar 2026 11:07:36 +0100 Subject: [PATCH 2/4] add CL entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a75f6041c..9b125a022 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - 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) +- Oversight DAO and Steering DAO addresses cannot be the same [#309](https://github.com/atomone-hub/atomone/pull/309) ### DEPENDENCIES From c584f48f6bc8fa38d76005e6b66a29704a48d954 Mon Sep 17 00:00:00 2001 From: Giuseppe Natale <12249307+giunatale@users.noreply.github.com> Date: Thu, 19 Mar 2026 11:27:16 +0100 Subject: [PATCH 3/4] fix tests --- x/coredaos/keeper/msg_server_test.go | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/x/coredaos/keeper/msg_server_test.go b/x/coredaos/keeper/msg_server_test.go index 86a109167..028f67820 100644 --- a/x/coredaos/keeper/msg_server_test.go +++ b/x/coredaos/keeper/msg_server_test.go @@ -18,10 +18,11 @@ import ( func TestMsgServerUpdateParams(t *testing.T) { timeDuration := time.Duration(1) - testAcc := simtestutil.CreateRandomAccounts(3) + testAcc := simtestutil.CreateRandomAccounts(4) bondedAcc := testAcc[0].String() unbondingAcc := testAcc[1].String() unbondedAcc := testAcc[2].String() + unbondedAcc2 := testAcc[3].String() tests := []struct { name string @@ -188,16 +189,31 @@ func TestMsgServerUpdateParams(t *testing.T) { Authority: "cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn", Params: types.Params{ SteeringDaoAddress: unbondedAcc, - OversightDaoAddress: unbondedAcc, + OversightDaoAddress: unbondedAcc2, VotingPeriodExtensionDuration: &timeDuration, }, }, setupMocks: func(ctx sdk.Context, m *testutil.Mocks) { // Address is not bonded or in unbonding - m.StakingKeeper.EXPECT().GetDelegatorBonded(ctx, sdk.MustAccAddressFromBech32(unbondedAcc)).Return(math.NewInt(0), nil).Times(2) - m.StakingKeeper.EXPECT().GetDelegatorUnbonding(ctx, sdk.MustAccAddressFromBech32(unbondedAcc)).Return(math.NewInt(0), nil).Times(2) + m.StakingKeeper.EXPECT().GetDelegatorBonded(ctx, sdk.MustAccAddressFromBech32(unbondedAcc)).Return(math.NewInt(0), nil) + m.StakingKeeper.EXPECT().GetDelegatorUnbonding(ctx, sdk.MustAccAddressFromBech32(unbondedAcc)).Return(math.NewInt(0), nil) + m.StakingKeeper.EXPECT().GetDelegatorBonded(ctx, sdk.MustAccAddressFromBech32(unbondedAcc2)).Return(math.NewInt(0), nil) + m.StakingKeeper.EXPECT().GetDelegatorUnbonding(ctx, sdk.MustAccAddressFromBech32(unbondedAcc2)).Return(math.NewInt(0), nil) }, }, + { + name: "steeringdao and oversight same address", + msg: &types.MsgUpdateParams{ + Authority: "cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn", + Params: types.Params{ + SteeringDaoAddress: unbondedAcc, + OversightDaoAddress: unbondedAcc, + VotingPeriodExtensionDuration: &timeDuration, + }, + }, + expectedErr: "steering DAO address and oversight DAO address cannot be the same: " + unbondedAcc, + setupMocks: func(ctx sdk.Context, m *testutil.Mocks) {}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { From a5c92bbf1aaaad21953c4f35124d1816b35892f6 Mon Sep 17 00:00:00 2001 From: Giuseppe Natale <12249307+giunatale@users.noreply.github.com> Date: Wed, 25 Mar 2026 14:46:59 +0100 Subject: [PATCH 4/4] compare addr bytes instead of strings --- x/coredaos/keeper/msg_server_test.go | 14 ++++++++++++++ x/coredaos/types/params.go | 12 +++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/x/coredaos/keeper/msg_server_test.go b/x/coredaos/keeper/msg_server_test.go index 028f67820..973ca3e65 100644 --- a/x/coredaos/keeper/msg_server_test.go +++ b/x/coredaos/keeper/msg_server_test.go @@ -1,6 +1,7 @@ package keeper_test import ( + "strings" "testing" "time" @@ -214,6 +215,19 @@ func TestMsgServerUpdateParams(t *testing.T) { expectedErr: "steering DAO address and oversight DAO address cannot be the same: " + unbondedAcc, setupMocks: func(ctx sdk.Context, m *testutil.Mocks) {}, }, + { + name: "steeringdao and oversight same address but different case", + msg: &types.MsgUpdateParams{ + Authority: "cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn", + Params: types.Params{ + SteeringDaoAddress: unbondedAcc, + OversightDaoAddress: strings.ToUpper(unbondedAcc), + VotingPeriodExtensionDuration: &timeDuration, + }, + }, + expectedErr: "steering DAO address and oversight DAO address cannot be the same: " + unbondedAcc, + setupMocks: func(ctx sdk.Context, m *testutil.Mocks) {}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/x/coredaos/types/params.go b/x/coredaos/types/params.go index a3337a579..67185846a 100644 --- a/x/coredaos/types/params.go +++ b/x/coredaos/types/params.go @@ -42,22 +42,28 @@ func DefaultParams() Params { // Validate validates the set of params func (p Params) ValidateBasic() error { + var ( + steeringDaoAddr sdk.AccAddress + oversightDaoAddr sdk.AccAddress + err error + ) + // Steering DAO address can only be empty (disabled) or a valid Bech32 address if p.SteeringDaoAddress != "" { - if _, err := sdk.AccAddressFromBech32(p.SteeringDaoAddress); err != nil { + if steeringDaoAddr, err = sdk.AccAddressFromBech32(p.SteeringDaoAddress); err != nil { return fmt.Errorf("invalid steering DAO address: %s: %w", p.SteeringDaoAddress, err) } } // Oversight DAO address can only be empty (disabled) or a valid Bech32 address if p.OversightDaoAddress != "" { - if _, err := sdk.AccAddressFromBech32(p.OversightDaoAddress); err != nil { + if oversightDaoAddr, err = sdk.AccAddressFromBech32(p.OversightDaoAddress); err != nil { return fmt.Errorf("invalid oversight DAO address: %s: %w", p.OversightDaoAddress, err) } } // Oversight DAO cannot be the same as the Steering DAO - if p.SteeringDaoAddress != "" && p.OversightDaoAddress != "" && p.SteeringDaoAddress == p.OversightDaoAddress { + if p.SteeringDaoAddress != "" && p.OversightDaoAddress != "" && steeringDaoAddr.Equals(oversightDaoAddr) { return fmt.Errorf("steering DAO address and oversight DAO address cannot be the same: %s", p.SteeringDaoAddress) }