diff --git a/proto/canto/govshuttle/v1/genesis.proto b/proto/canto/govshuttle/v1/genesis.proto index 5bc4b9a8..b6028e23 100644 --- a/proto/canto/govshuttle/v1/genesis.proto +++ b/proto/canto/govshuttle/v1/genesis.proto @@ -10,5 +10,6 @@ option go_package = "github.com/Canto-Network/Canto/v7/x/govshuttle/types"; // GenesisState defines the govshuttle module's genesis state. message GenesisState { Params params = 1 [ (gogoproto.nullable) = false ]; + bytes port_address = 2; // this line is used by starport scaffolding # genesis/proto/state } diff --git a/x/govshuttle/genesis.go b/x/govshuttle/genesis.go index cfd60638..9c41dabb 100644 --- a/x/govshuttle/genesis.go +++ b/x/govshuttle/genesis.go @@ -5,6 +5,7 @@ import ( "github.com/Canto-Network/Canto/v7/x/govshuttle/types" sdk "github.com/cosmos/cosmos-sdk/types" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + "github.com/ethereum/go-ethereum/common" ) // InitGenesis initializes the capability module's state from a provided genesis @@ -12,16 +13,24 @@ import ( func InitGenesis(ctx sdk.Context, k keeper.Keeper, accountKeeper authkeeper.AccountKeeper, genState types.GenesisState) { // this line is used by starport scaffolding # genesis/module/init k.SetParams(ctx, genState.Params) - + if genState.PortAddress != nil { + k.SetPort(ctx, common.BytesToAddress(genState.PortAddress)) + } if acc := accountKeeper.GetModuleAccount(ctx, types.ModuleName); acc == nil { panic("the govshuttle module account has not been set") } + } // ExportGenesis returns the capability module's exported genesis. func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { - genesis := types.DefaultGenesis() - genesis.Params = k.GetParams(ctx) + portAddress, found := k.GetPort(ctx) + var genesis *types.GenesisState + if found { + genesis = types.NewGenesisState(k.GetParams(ctx), portAddress.Bytes()) + } else { + genesis = types.NewGenesisState(k.GetParams(ctx), nil) + } // this line is used by starport scaffolding # genesis/module/export diff --git a/x/govshuttle/genesis_test.go b/x/govshuttle/genesis_test.go deleted file mode 100644 index 13baacd8..00000000 --- a/x/govshuttle/genesis_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package govshuttle_test - -import ( - "testing" - //keepertest "github.com/Canto-Network/Canto/v2/testutil/keeper" - //"github.com/Canto-Network/Canto/v2/testutil/nullify" - // "github.com/Canto-Network/Canto/v2/x/govshuttle" - // "github.com/Canto-Network/Canto/v2/x/govshuttle/types" - // "github.com/stretchr/testify/require" -) - -func TestGenesis(t *testing.T) { - // genesisState := types.GenesisState{ - // Params: types.DefaultParams(), - - // // this line is used by starport scaffolding # genesis/test/state - // } - - // k, ctx := keepertest.govshuttleKeeper(t) - // govshuttle.InitGenesis(ctx, *k, genesisState) - // got := govshuttle.ExportGenesis(ctx, *k) - // require.NotNil(t, got) - - // nullify.Fill(&genesisState) - // nullify.Fill(got) - - // this line is used by starport scaffolding # genesis/test/assert -} diff --git a/x/govshuttle/keeper/genesis_test.go b/x/govshuttle/keeper/genesis_test.go new file mode 100644 index 00000000..9ddbca94 --- /dev/null +++ b/x/govshuttle/keeper/genesis_test.go @@ -0,0 +1,82 @@ +package keeper_test + +import ( + "time" + + "github.com/evmos/ethermint/tests" + + "github.com/Canto-Network/Canto/v7/x/govshuttle" + "github.com/Canto-Network/Canto/v7/x/govshuttle/types" +) + +func (suite *KeeperTestSuite) TestDefaultGenesis() { + genState := types.DefaultGenesis() + + govshuttle.InitGenesis(suite.ctx, suite.app.GovshuttleKeeper, suite.app.AccountKeeper, *genState) + got := govshuttle.ExportGenesis(suite.ctx, suite.app.GovshuttleKeeper) + suite.Require().Equal(genState, got) +} + +func (suite *KeeperTestSuite) TestImportExportGenesisEmpty() { + _, found := suite.app.GovshuttleKeeper.GetPort(suite.ctx) + suite.Require().False(found) + genState := govshuttle.ExportGenesis(suite.ctx, suite.app.GovshuttleKeeper) + suite.Require().Nil(genState.PortAddress) + + // Copy genState to genState2 and init with it + var genState2 types.GenesisState + bz := suite.app.AppCodec().MustMarshalJSON(genState) + suite.app.AppCodec().MustUnmarshalJSON(bz, &genState2) + govshuttle.InitGenesis(suite.ctx, suite.app.GovshuttleKeeper, suite.app.AccountKeeper, genState2) + + _, found = suite.app.GovshuttleKeeper.GetPort(suite.ctx) + suite.Require().False(found) + + genState3 := govshuttle.ExportGenesis(suite.ctx, suite.app.GovshuttleKeeper) + suite.Equal(*genState, genState2) + suite.Equal(genState2, *genState3) + suite.Require().Nil(genState.PortAddress) +} + +func (suite *KeeperTestSuite) TestInitExportGenesis() { + portAddress := tests.GenerateAddress() + expGenesis := types.NewGenesisState(types.DefaultParams(), portAddress.Bytes()) + + govshuttle.InitGenesis(suite.ctx, suite.app.GovshuttleKeeper, suite.app.AccountKeeper, *expGenesis) + genState := govshuttle.ExportGenesis(suite.ctx, suite.app.GovshuttleKeeper) + suite.Require().Equal(expGenesis, genState) + + bz := suite.app.AppCodec().MustMarshalJSON(genState) + + var genState2 types.GenesisState + suite.app.AppCodec().MustUnmarshalJSON(bz, &genState2) + govshuttle.InitGenesis(suite.ctx, suite.app.GovshuttleKeeper, suite.app.AccountKeeper, genState2) + genState3 := govshuttle.ExportGenesis(suite.ctx, suite.app.GovshuttleKeeper) + + suite.Require().Equal(*genState, genState2) + suite.Require().Equal(genState2, *genState3) +} + +func (suite *KeeperTestSuite) TestImportExportGenesis() { + t, _ := time.Parse(time.RFC3339, "2022-01-01T00:00:00Z") + suite.ctx = suite.ctx.WithBlockHeight(1).WithBlockTime(t) + + portAddress := tests.GenerateAddress() + suite.app.GovshuttleKeeper.SetPort(suite.ctx, portAddress) + + genState := govshuttle.ExportGenesis(suite.ctx, suite.app.GovshuttleKeeper) + bz := suite.app.AppCodec().MustMarshalJSON(genState) + + // Copy genState to genState2 and init with it + var genState2 types.GenesisState + suite.app.AppCodec().MustUnmarshalJSON(bz, &genState2) + govshuttle.InitGenesis(suite.ctx, suite.app.GovshuttleKeeper, suite.app.AccountKeeper, genState2) + exported := govshuttle.ExportGenesis(suite.ctx, suite.app.GovshuttleKeeper) + suite.Equal(*genState, *exported) + + suite.ctx = suite.ctx.WithBlockHeight(1).WithBlockTime(t) + + p, found := suite.app.GovshuttleKeeper.GetPort(suite.ctx) + suite.True(found) + suite.Equal(portAddress, p) +} diff --git a/x/govshuttle/keeper/keeper.go b/x/govshuttle/keeper/keeper.go index d89f423b..bc3c777d 100644 --- a/x/govshuttle/keeper/keeper.go +++ b/x/govshuttle/keeper/keeper.go @@ -7,10 +7,11 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/tendermint/tendermint/libs/log" - "github.com/Canto-Network/Canto/v7/x/govshuttle/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" + + "github.com/Canto-Network/Canto/v7/x/govshuttle/types" ) type ( diff --git a/x/govshuttle/keeper/keeper_test.go b/x/govshuttle/keeper/keeper_test.go index 73096158..db821b18 100644 --- a/x/govshuttle/keeper/keeper_test.go +++ b/x/govshuttle/keeper/keeper_test.go @@ -4,8 +4,14 @@ import ( "encoding/json" "math/big" "testing" + "time" + "github.com/evmos/ethermint/crypto/ethsecp256k1" "github.com/stretchr/testify/suite" + "github.com/tendermint/tendermint/crypto/tmhash" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + tmversion "github.com/tendermint/tendermint/proto/tendermint/version" + "github.com/tendermint/tendermint/version" "github.com/Canto-Network/Canto/v7/app" "github.com/cosmos/cosmos-sdk/crypto/keyring" @@ -53,6 +59,42 @@ func (suite *KeeperTestSuite) DoSetupTest(t require.TestingT) { //init app suite.app = app.Setup(checkTx, feemarketGenesis) + + priv, err := ethsecp256k1.GenerateKey() + require.NoError(t, err) + + suite.address = common.BytesToAddress(priv.PubKey().Address().Bytes()) + + // consensus key + privCons, err := ethsecp256k1.GenerateKey() + require.NoError(t, err) + consAddress := sdk.ConsAddress(privCons.PubKey().Address()) + + // setup context + suite.ctx = suite.app.BaseApp.NewContext(checkTx, tmproto.Header{ + Height: 1, + ChainID: "canto_9001-1", + Time: time.Now().UTC(), + ProposerAddress: consAddress.Bytes(), + + Version: tmversion.Consensus{ + Block: version.BlockProtocol, + }, + LastBlockId: tmproto.BlockID{ + Hash: tmhash.Sum([]byte("block_id")), + PartSetHeader: tmproto.PartSetHeader{ + Total: 11, + Hash: tmhash.Sum([]byte("partset_header")), + }, + }, + AppHash: tmhash.Sum([]byte("app")), + DataHash: tmhash.Sum([]byte("data")), + EvidenceHash: tmhash.Sum([]byte("evidence")), + ValidatorsHash: tmhash.Sum([]byte("validators")), + NextValidatorsHash: tmhash.Sum([]byte("next_validators")), + ConsensusHash: tmhash.Sum([]byte("consensus")), + LastResultsHash: tmhash.Sum([]byte("last_result")), + }) } func (suite *KeeperTestSuite) SetupTest() { diff --git a/x/govshuttle/types/genesis.go b/x/govshuttle/types/genesis.go index 8df94bae..aa6e9e46 100644 --- a/x/govshuttle/types/genesis.go +++ b/x/govshuttle/types/genesis.go @@ -1,17 +1,18 @@ package types -import ( -// this line is used by starport scaffolding # genesis/types/import -) - // DefaultIndex is the default capability global index const DefaultIndex uint64 = 1 // DefaultGenesis returns the default Capability genesis state func DefaultGenesis() *GenesisState { + return NewGenesisState(DefaultParams(), nil) +} + +func NewGenesisState(params Params, portAddress []byte) *GenesisState { return &GenesisState{ - // this line is used by starport scaffolding # genesis/types/default - Params: DefaultParams(), + Params: params, + PortAddress: portAddress, + // this line is used by starport scaffolding # genesis/types/init } } diff --git a/x/govshuttle/types/genesis.pb.go b/x/govshuttle/types/genesis.pb.go index a53f33c7..45929555 100644 --- a/x/govshuttle/types/genesis.pb.go +++ b/x/govshuttle/types/genesis.pb.go @@ -25,7 +25,8 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // GenesisState defines the govshuttle module's genesis state. type GenesisState struct { - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` + Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` + PortAddress []byte `protobuf:"bytes,2,opt,name=port_address,json=portAddress,proto3" json:"port_address,omitempty"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -68,6 +69,13 @@ func (m *GenesisState) GetParams() Params { return Params{} } +func (m *GenesisState) GetPortAddress() []byte { + if m != nil { + return m.PortAddress + } + return nil +} + func init() { proto.RegisterType((*GenesisState)(nil), "canto.govshuttle.v1.GenesisState") } @@ -75,20 +83,22 @@ func init() { func init() { proto.RegisterFile("canto/govshuttle/v1/genesis.proto", fileDescriptor_356493b1fc5972f0) } var fileDescriptor_356493b1fc5972f0 = []byte{ - // 208 bytes of a gzipped FileDescriptorProto + // 237 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4c, 0x4e, 0xcc, 0x2b, 0xc9, 0xd7, 0x4f, 0xcf, 0x2f, 0x2b, 0xce, 0x28, 0x2d, 0x29, 0xc9, 0x49, 0xd5, 0x2f, 0x33, 0xd4, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x06, 0x2b, 0xd1, 0x43, 0x28, 0xd1, 0x2b, 0x33, 0x94, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0xcb, 0xeb, - 0x83, 0x58, 0x10, 0xa5, 0x52, 0x2a, 0x58, 0x4d, 0x43, 0x68, 0x04, 0xab, 0x52, 0xf2, 0xe4, 0xe2, + 0x83, 0x58, 0x10, 0xa5, 0x52, 0x2a, 0x58, 0x4d, 0x43, 0x68, 0x04, 0xab, 0x52, 0xca, 0xe1, 0xe2, 0x71, 0x87, 0xd8, 0x10, 0x5c, 0x92, 0x58, 0x92, 0x2a, 0x64, 0xc9, 0xc5, 0x56, 0x90, 0x58, 0x94, 0x98, 0x5b, 0x2c, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x6d, 0x24, 0xad, 0x87, 0xc5, 0x46, 0xbd, 0x00, - 0xb0, 0x12, 0x27, 0x96, 0x13, 0xf7, 0xe4, 0x19, 0x82, 0xa0, 0x1a, 0x9c, 0xfc, 0x4e, 0x3c, 0x92, - 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, - 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, 0x24, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, - 0x39, 0x3f, 0x57, 0xdf, 0x19, 0x64, 0x9c, 0xae, 0x5f, 0x6a, 0x49, 0x79, 0x7e, 0x51, 0x36, 0x84, - 0xa7, 0x5f, 0x66, 0xae, 0x5f, 0x81, 0xec, 0xd0, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0xb0, - 0x0b, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xba, 0xa8, 0x69, 0x0f, 0x17, 0x01, 0x00, 0x00, + 0xb0, 0x12, 0x27, 0x96, 0x13, 0xf7, 0xe4, 0x19, 0x82, 0xa0, 0x1a, 0x84, 0x14, 0xb9, 0x78, 0x0a, + 0xf2, 0x8b, 0x4a, 0xe2, 0x13, 0x53, 0x52, 0x8a, 0x52, 0x8b, 0x8b, 0x25, 0x98, 0x14, 0x18, 0x35, + 0x78, 0x82, 0xb8, 0x41, 0x62, 0x8e, 0x10, 0x21, 0x27, 0xbf, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, + 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, 0x0b, 0x8f, 0xe5, 0x18, 0x6e, + 0x3c, 0x96, 0x63, 0x88, 0x32, 0x49, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, + 0x77, 0x06, 0xd9, 0xa8, 0xeb, 0x97, 0x5a, 0x52, 0x9e, 0x5f, 0x94, 0x0d, 0xe1, 0xe9, 0x97, 0x99, + 0xeb, 0x57, 0x20, 0xfb, 0xa5, 0xa4, 0xb2, 0x20, 0xb5, 0x38, 0x89, 0x0d, 0xec, 0x09, 0x63, 0x40, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xb7, 0x01, 0xeb, 0xfd, 0x3a, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -111,6 +121,13 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.PortAddress) > 0 { + i -= len(m.PortAddress) + copy(dAtA[i:], m.PortAddress) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.PortAddress))) + i-- + dAtA[i] = 0x12 + } { size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -143,6 +160,10 @@ func (m *GenesisState) Size() (n int) { _ = l l = m.Params.Size() n += 1 + l + sovGenesis(uint64(l)) + l = len(m.PortAddress) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } return n } @@ -214,6 +235,40 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PortAddress", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PortAddress = append(m.PortAddress[:0], dAtA[iNdEx:postIndex]...) + if m.PortAddress == nil { + m.PortAddress = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:])