Skip to content

Commit e505588

Browse files
byte-bandittaariq
andauthored
feat: 24h vote on new compass deployments (#1344)
# Related Github tickets - VolumeFi#2617 # Testing completed - [x] test coverage exists or has been added/updated - [x] tested in a private testnet # Breaking changes - [x] I have checked my code for breaking changes - [x] If there are breaking changes, there is a supporting migration. Co-authored-by: Taariq Lewis <[email protected]>
1 parent 4090cca commit e505588

15 files changed

+563
-75
lines changed

app/app.go

+1
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,7 @@ func New(
599599
app.EvmKeeper = *evmmodulekeeper.NewKeeper(
600600
appCodec,
601601
runtime.NewKVStoreService(keys[evmmoduletypes.StoreKey]),
602+
authorityAddress,
602603
app.ConsensusKeeper,
603604
app.ValsetKeeper,
604605
authcodec.NewBech32Codec(chainparams.ValidatorAddressPrefix),

proto/palomachain/paloma/evm/deploy_new_smart_contract_proposal.proto

+3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ package palomachain.paloma.evm;
33

44
option go_package = "github.com/palomachain/paloma/v2/x/evm/types";
55

6+
// This message is deprecated, use MsgDeployNewSmartContractProposalV2.
67
message DeployNewSmartContractProposal {
8+
option deprecated = true;
9+
710
string title = 1;
811
string description = 2;
912

proto/palomachain/paloma/evm/tx.proto

+14
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ service Msg {
1313
rpc RemoveSmartContractDeployment(MsgRemoveSmartContractDeploymentRequest)
1414
returns (RemoveSmartContractDeploymentResponse);
1515

16+
// ===== Governance messages =====
17+
rpc ProposeNewSmartContractDeployment(MsgDeployNewSmartContractProposalV2)
18+
returns (google.protobuf.Empty);
19+
1620
// ===== User Smart Contracts =====
1721
rpc UploadUserSmartContract(MsgUploadUserSmartContractRequest)
1822
returns (MsgUploadUserSmartContractResponse);
@@ -74,3 +78,13 @@ message MsgDeployUserSmartContractRequest {
7478
message MsgDeployUserSmartContractResponse {
7579
uint64 msg_id = 1;
7680
}
81+
82+
message MsgDeployNewSmartContractProposalV2 {
83+
option (cosmos.msg.v1.signer) = "metadata";
84+
palomachain.paloma.valset.MsgMetadata metadata = 1
85+
[ (gogoproto.nullable) = false ];
86+
string authority = 2 [ (cosmos_proto.scalar) = "cosmos.AddressString" ];
87+
88+
string abiJSON = 3;
89+
string bytecodeHex = 4;
90+
}

tests/integration/helper/fixture.go

+1
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ func InitFixture(t ginkgo.FullGinkgoTInterface) *Fixture {
379379
*evmKeeper = *evmmodulekeeper.NewKeeper(
380380
appCodec,
381381
runtime.NewKVStoreService(keys[evmmoduletypes.StoreKey]),
382+
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
382383
consensusKeeper,
383384
valsetKeeper,
384385
authcodec.NewBech32Codec(params2.ValidatorAddressPrefix),

testutil/keeper/evm.go

+2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ func EvmKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) {
3737
k := keeper.NewKeeper(
3838
cdc,
3939
runtime.NewKVStoreService(storeKey),
40+
// authtypes.NewModuleAddress(govtypes.ModuleName).String(),
41+
"",
4042
nil,
4143
mocks.NewValsetKeeper(t),
4244
authcodec.NewBech32Codec(params2.ValidatorAddressPrefix),

x/evm/keeper/keeper.go

+3
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ var _ valsettypes.OnSnapshotBuiltListener = &Keeper{}
109109
type Keeper struct {
110110
cdc codec.BinaryCodec
111111
storeKey corestore.KVStoreService
112+
authority string
112113
ConsensusKeeper types.ConsensusKeeper
113114
SchedulerKeeper types.SchedulerKeeper
114115
Valset types.ValsetKeeper
@@ -125,6 +126,7 @@ type Keeper struct {
125126
func NewKeeper(
126127
cdc codec.BinaryCodec,
127128
storeService corestore.KVStoreService,
129+
authority string,
128130
consensusKeeper types.ConsensusKeeper,
129131
valsetKeeper types.ValsetKeeper, a address.Codec,
130132
metrixKeeper types.MetrixKeeper,
@@ -133,6 +135,7 @@ func NewKeeper(
133135
k := &Keeper{
134136
cdc: cdc,
135137
storeKey: storeService,
138+
authority: authority,
136139
ConsensusKeeper: consensusKeeper,
137140
Valset: valsetKeeper,
138141
msgSender: msgSender{

x/evm/keeper/msg_server.go

+27
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package keeper
22

33
import (
4+
"context"
5+
6+
sdkerrors "cosmossdk.io/errors"
7+
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
48
"github.com/palomachain/paloma/v2/x/evm/types"
9+
"google.golang.org/protobuf/types/known/emptypb"
510
)
611

712
type msgServer struct {
@@ -15,3 +20,25 @@ func NewMsgServerImpl(keeper Keeper) types.MsgServer {
1520
}
1621

1722
var _ types.MsgServer = msgServer{}
23+
24+
func (k msgServer) ProposeNewSmartContractDeployment(ctx context.Context, req *types.MsgDeployNewSmartContractProposalV2) (*emptypb.Empty, error) {
25+
if err := req.ValidateBasic(); err != nil {
26+
return nil, sdkerrors.Wrapf(govtypes.ErrInvalidSigner, "message validation failed: %v", err)
27+
}
28+
if req.Authority != req.Metadata.Creator {
29+
return nil, sdkerrors.Wrapf(govtypes.ErrInvalidSigner, "creator mismatch; expected %s, got %s", k.authority, req.Metadata.Creator)
30+
}
31+
if req.Metadata.Creator != k.authority {
32+
return nil, sdkerrors.Wrapf(govtypes.ErrInvalidSigner, "invalid authority; expected %s, got %s", k.authority, req.Metadata.Creator)
33+
}
34+
sc, err := k.SaveNewSmartContract(ctx, req.GetAbiJSON(), req.Bytecode())
35+
if err != nil {
36+
return nil, err
37+
}
38+
39+
if err := k.SetAsCompassContract(ctx, sc); err != nil {
40+
return nil, err
41+
}
42+
43+
return &emptypb.Empty{}, nil
44+
}

x/evm/keeper/setup_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import (
1212
"github.com/cosmos/cosmos-sdk/runtime"
1313
sdk "github.com/cosmos/cosmos-sdk/types"
1414
authcodec "github.com/cosmos/cosmos-sdk/x/auth/codec"
15+
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
16+
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
1517
"github.com/palomachain/paloma/v2/app/params"
1618
"github.com/palomachain/paloma/v2/testutil"
1719
"github.com/palomachain/paloma/v2/x/evm/types"
@@ -56,6 +58,7 @@ func NewEvmKeeper(t testutil.TB) (*Keeper, mockedServices, sdk.Context) {
5658
k := NewKeeper(
5759
appCodec,
5860
storeService,
61+
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
5962
ms.ConsensusKeeper,
6063
ms.ValsetKeeper,
6164
authcodec.NewBech32Codec(params.ValidatorAddressPrefix),

x/evm/types/codec.go

+2
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ func RegisterCodec(cdc *codec.LegacyAmino) {
1515
cdc.RegisterConcrete(&RelayWeightsProposal{}, "evm/RelayWeightsProposal", nil)
1616
cdc.RegisterConcrete(&SetFeeManagerAddressProposal{}, "evm/SetFeeManagerAddressProposal", nil)
1717
cdc.RegisterConcrete(&SetSmartContractDeployersProposal{}, "evm/SetSmartContractDeployersProposal", nil)
18+
cdc.RegisterConcrete(&MsgDeployNewSmartContractProposalV2{}, "evm/ProposeNewSmartContractDeployment", nil)
1819
}
1920

2021
func RegisterInterfaces(registry cdctypes.InterfaceRegistry) {
2122
registry.RegisterImplementations(
2223
(*sdk.Msg)(nil),
2324
&MsgRemoveSmartContractDeploymentRequest{},
25+
&MsgDeployNewSmartContractProposalV2{},
2426
)
2527
registry.RegisterImplementations(
2628
(*govv1beta1types.Content)(nil),

x/evm/types/deploy_new_smart_contract_proposal.pb.go

+20-17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x/evm/types/errors.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ import (
99

1010
// x/evm module sentinel errors
1111
var (
12-
ErrSample = sdkerrors.Register(ModuleName, 1100, "sample error")
13-
ErrInvalid = sdkerrors.Register(ModuleName, 1200, "invalid")
12+
ErrSample = sdkerrors.Register(ModuleName, 1100, "sample error")
13+
ErrInvalid = sdkerrors.Register(ModuleName, 1200, "invalid")
14+
ErrUnauthorized = sdkerrors.Register(ModuleName, 1300, "unauthorized")
1415
)
1516

1617
var (

x/evm/types/msg_remove_smart_contract_deployment_request.go

-14
This file was deleted.

x/evm/types/msgs.go

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package types
2+
3+
import (
4+
sdk "github.com/cosmos/cosmos-sdk/types"
5+
"github.com/ethereum/go-ethereum/common"
6+
"github.com/palomachain/paloma/v2/util/libmeta"
7+
)
8+
9+
// nolint: exhaustruct
10+
var (
11+
_ sdk.Msg = &MsgRemoveSmartContractDeploymentRequest{}
12+
_ sdk.Msg = &MsgDeployNewSmartContractProposalV2{}
13+
)
14+
15+
func (msg *MsgRemoveSmartContractDeploymentRequest) ValidateBasic() error {
16+
return libmeta.ValidateBasic(msg)
17+
}
18+
19+
func (msg *MsgRemoveSmartContractDeploymentRequest) GetSigners() []sdk.AccAddress {
20+
return libmeta.GetSigners(msg)
21+
}
22+
23+
func (msg *MsgRemoveSmartContractDeploymentRequest) Route() string { return RouterKey }
24+
25+
func (msg *MsgRemoveSmartContractDeploymentRequest) Type() string {
26+
return "remove_smart_contract_deployment"
27+
}
28+
29+
func (msg *MsgRemoveSmartContractDeploymentRequest) GetSignBytes() []byte {
30+
return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg))
31+
}
32+
33+
func (msg *MsgDeployNewSmartContractProposalV2) ValidateBasic() error {
34+
if len(msg.AbiJSON) < 1 || len(msg.BytecodeHex) < 1 {
35+
return ErrInvalid.Wrap("abi json or bytecode hex is empty")
36+
}
37+
38+
if msg.Authority != msg.Metadata.Creator {
39+
return ErrUnauthorized.Wrapf("authority mismatch: %s", msg.Authority)
40+
}
41+
42+
if _, err := sdk.AccAddressFromBech32(msg.Authority); err != nil {
43+
return ErrInvalid.Wrap("authority address is invalid")
44+
}
45+
46+
return libmeta.ValidateBasic(msg)
47+
}
48+
49+
func (msg *MsgDeployNewSmartContractProposalV2) GetSigners() []sdk.AccAddress {
50+
return libmeta.GetSigners(msg)
51+
}
52+
53+
func (msg *MsgDeployNewSmartContractProposalV2) Route() string { return RouterKey }
54+
55+
func (msg *MsgDeployNewSmartContractProposalV2) Type() string {
56+
return "propose_new_smart_contract_deployment"
57+
}
58+
59+
func (msg *MsgDeployNewSmartContractProposalV2) GetSignBytes() []byte {
60+
return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg))
61+
}
62+
63+
func (a *MsgDeployNewSmartContractProposalV2) Bytecode() []byte {
64+
return common.FromHex(a.GetBytecodeHex())
65+
}

0 commit comments

Comments
 (0)