Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 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
7 changes: 7 additions & 0 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import (
"path/filepath"
"strings"

"github.com/archway-network/archway/x/genmsg"

wasmdKeeper "github.com/CosmWasm/wasmd/x/wasm/keeper"
wasmdTypes "github.com/CosmWasm/wasmd/x/wasm/types"
cosmwasm "github.com/CosmWasm/wasmvm"
Expand Down Expand Up @@ -207,6 +209,7 @@ var (
wasm.AppModuleBasic{},
tracking.AppModuleBasic{},
rewards.AppModuleBasic{},
genmsg.AppModule{},
)

// module account permissions
Expand Down Expand Up @@ -587,6 +590,7 @@ func NewArchwayApp(
transferModule,
tracking.NewAppModule(app.appCodec, app.TrackingKeeper),
rewards.NewAppModule(app.appCodec, app.RewardsKeeper),
genmsg.NewAppModule(app.MsgServiceRouter()),
crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants), // always be last to make sure that it checks for all invariants and not only part of them
)

Expand All @@ -607,6 +611,7 @@ func NewArchwayApp(
govtypes.ModuleName,
crisistypes.ModuleName, // doesn't have BeginBlocker, so order is not important
genutiltypes.ModuleName,
genmsg.ModuleName,
authz.ModuleName,
feegrant.ModuleName,
paramstypes.ModuleName,
Expand Down Expand Up @@ -636,6 +641,7 @@ func NewArchwayApp(
slashingtypes.ModuleName,
minttypes.ModuleName,
genutiltypes.ModuleName,
genmsg.ModuleName,
evidencetypes.ModuleName,
paramstypes.ModuleName,
upgradetypes.ModuleName,
Expand Down Expand Up @@ -680,6 +686,7 @@ func NewArchwayApp(
wasm.ModuleName,
// wasm gas tracking
trackingTypes.ModuleName,
genmsg.ModuleName,
// invariants checks are always the last to run
crisistypes.ModuleName,
)
Expand Down
4 changes: 2 additions & 2 deletions app/test_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ func ConvertAddrsToValAddrs(addrs []sdk.AccAddress) []sdk.ValAddress {
return valAddrs
}

func TestAddr(addr string, bech string) (sdk.AccAddress, error) {
func TestAddr(addr, bech string) (sdk.AccAddress, error) {
res, err := sdk.AccAddressFromHex(addr)
if err != nil {
return nil, err
Expand Down Expand Up @@ -417,7 +417,7 @@ func SignAndDeliver(
// GenSequenceOfTxs generates a set of signed transactions of messages, such
// that they differ only by having the sequence numbers incremented between
// every transaction.
func GenSequenceOfTxs(txGen client.TxConfig, msgs []sdk.Msg, accNums []uint64, initSeqNums []uint64, numToGenerate int, priv ...cryptotypes.PrivKey) ([]sdk.Tx, error) {
func GenSequenceOfTxs(txGen client.TxConfig, msgs []sdk.Msg, accNums, initSeqNums []uint64, numToGenerate int, priv ...cryptotypes.PrivKey) ([]sdk.Tx, error) {
txs := make([]sdk.Tx, numToGenerate)
var err error
for i := 0; i < numToGenerate; i++ {
Expand Down
34 changes: 34 additions & 0 deletions docs/proto/proto-docs.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

## Table of Contents

- [archway/genmsgs/v1/genmsgs.proto](#archway/genmsgs/v1/genmsgs.proto)
- [GenesisState](#archway.genmsg.v1.GenesisState)

- [archway/rewards/v1/rewards.proto](#archway/rewards/v1/rewards.proto)
- [BlockRewards](#archway.rewards.v1.BlockRewards)
- [ContractMetadata](#archway.rewards.v1.ContractMetadata)
Expand Down Expand Up @@ -76,6 +79,37 @@



<a name="archway/genmsgs/v1/genmsgs.proto"></a>
<p align="right"><a href="#top">Top</a></p>

## archway/genmsgs/v1/genmsgs.proto



<a name="archway.genmsg.v1.GenesisState"></a>

### GenesisState
GenesisState represents the messages to be processed during genesis by the genmsg module.


| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| `messages` | [google.protobuf.Any](#google.protobuf.Any) | repeated | |





<!-- end messages -->

<!-- end enums -->

<!-- end HasExtensions -->

<!-- end services -->



<a name="archway/rewards/v1/rewards.proto"></a>
<p align="right"><a href="#top">Top</a></p>

Expand Down
13 changes: 13 additions & 0 deletions e2e/testing/chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ import (
"github.com/archway-network/archway/app"
)

var TestAccountAddr = sdk.AccAddress("test")

// TestChain keeps a test chain state and provides helper functions to simulate various operations.
// Heavily inspired by the TestChain from the ibc-go repo (https://github.com/cosmos/ibc-go/blob/main/testing/chain.go).
// Reasons for creating a custom TestChain rather than using the ibc-go's one are: to simplify it,
Expand Down Expand Up @@ -125,6 +127,9 @@ func NewTestChain(t *testing.T, chainIdx int, opts ...interface{}) *TestChain {
genAccs = append(genAccs, acc)
genAccPrivKeys = append(genAccPrivKeys, accPrivKey)
}
if chainCfg.DummyTestAddr {
genAccs = append(genAccs, authTypes.NewBaseAccount(TestAccountAddr, nil, uint64(len(genAccs))-1, 0)) // deterministic account for testing purposes
}

genAmt, ok := sdk.NewIntFromString(chainCfg.GenBalanceAmount)
require.True(t, ok)
Expand Down Expand Up @@ -188,6 +193,14 @@ func NewTestChain(t *testing.T, chainIdx int, opts ...interface{}) *TestChain {
totalSupply = totalSupply.Add(genCoins...)
}

if chainCfg.DummyTestAddr {
balances = append(balances, bankTypes.Balance{
Address: TestAccountAddr.String(), // add some balances to our dummy
Coins: genCoins,
})
totalSupply = totalSupply.Add(genCoins...)
}

balances = append(balances, bankTypes.Balance{
Address: authTypes.NewModuleAddress(stakingTypes.BondedPoolName).String(),
Coins: bondedPoolCoins,
Expand Down
8 changes: 8 additions & 0 deletions e2e/testing/chain_options.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ type chainConfig struct {
BondAmount string
LoggerEnabled bool
DefaultFeeAmt string
DummyTestAddr bool
}

type (
Expand All @@ -38,6 +39,7 @@ func defaultChainConfig() chainConfig {
GenBalanceAmount: archway.DefaultPowerReduction.MulRaw(100).String(),
BondAmount: archway.DefaultPowerReduction.MulRaw(1).String(),
DefaultFeeAmt: archway.DefaultPowerReduction.QuoRaw(10).String(), // 0.1
DummyTestAddr: false,
}
}

Expand All @@ -47,6 +49,12 @@ func WithValidatorsNum(num int) TestChainConfigOption {
}
}

func WithDummyTestAddress() TestChainConfigOption {
return func(cfg *chainConfig) {
cfg.DummyTestAddr = true
}
}

// WithGenAccounts sets the number of genesis accounts
func WithGenAccounts(num int) TestChainConfigOption {
return func(cfg *chainConfig) {
Expand Down
2 changes: 1 addition & 1 deletion e2e/testing/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ type grpcClient struct {
app *app.ArchwayApp
}

func (c grpcClient) Invoke(ctx context.Context, method string, args interface{}, reply interface{}, opts ...grpc.CallOption) error {
func (c grpcClient) Invoke(ctx context.Context, method string, args, reply interface{}, opts ...grpc.CallOption) error {
req := args.(codec.ProtoMarshaler)
resp := c.app.Query(abci.RequestQuery{
Data: c.app.AppCodec().MustMarshal(req),
Expand Down
2 changes: 1 addition & 1 deletion e2e/txfees_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func (s *E2ETestSuite) TestTxFees() {
s.Require().True(ok)

totalSupplyReceived := chain.GetApp().BankKeeper.GetSupply(ctx, sdk.DefaultBondDenom)
s.Require().True(totalSupplyReceived.Amount.LTE(totalSupplyMaxAmtExpected), "total supply", totalSupplyReceived.String())
s.Require().Truef(totalSupplyReceived.Amount.LTE(totalSupplyMaxAmtExpected), "total supply %s", totalSupplyReceived.String())
}

senderAcc := chain.GetAccount(0)
Expand Down
Empty file added genesis.json
Empty file.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.19

require (
github.com/CosmWasm/cosmwasm-go v0.5.1-0.20220822092235-974247a04ac7
github.com/CosmWasm/wasmd v0.29.2
github.com/CosmWasm/wasmd v0.32.0
Comment thread
zanicar marked this conversation as resolved.
github.com/CosmWasm/wasmvm v1.2.3
github.com/archway-network/voter v0.0.0-00010101000000-000000000000
github.com/cosmos/cosmos-sdk v0.45.15
Expand Down
12 changes: 12 additions & 0 deletions proto/archway/genmsgs/v1/genmsgs.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
syntax = "proto3";
package archway.genmsg.v1;

import "google/protobuf/any.proto";


option go_package = "github.com/archway-network/archway/x/genmsg/v1";

// GenesisState represents the messages to be processed during genesis by the genmsg module.
message GenesisState {
repeated google.protobuf.Any messages = 1;
}
Empty file added test_genesis.sh
Empty file.
68 changes: 68 additions & 0 deletions x/genmsg/genesis.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package genmsg

import (
"fmt"
"log"

v1 "github.com/archway-network/archway/x/genmsg/v1"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/codec/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)

func anyToMsg(ir types.InterfaceRegistry, anyMsg *types.Any) (sdk.Msg, error) {
var sdkMsg sdk.Msg
err := ir.UnpackAny(anyMsg, &sdkMsg)
if err != nil {
return nil, err
}
if err = sdkMsg.ValidateBasic(); err != nil {
return nil, err
}
return sdkMsg, nil
}

func validateGenesis(cdc codec.JSONCodec, genesis *v1.GenesisState) error {
interfaceRegistryProvider, ok := cdc.(interface {
InterfaceRegistry() types.InterfaceRegistry
})
if !ok {
return fmt.Errorf("codec does not implement InterfaceRegistry")
}
interfaceRegistry := interfaceRegistryProvider.InterfaceRegistry()
// check if all messages are known by the codec
for i, anyMsg := range genesis.Messages {
if _, err := anyToMsg(interfaceRegistry, anyMsg); err != nil {
return fmt.Errorf("at index %d: %w", i, err)
}
}
return nil
}

func initGenesis(context sdk.Context, cdc codec.JSONCodec, router MessageRouter, genesis *v1.GenesisState) error {
interfaceRegistryProvider, ok := cdc.(interface {
InterfaceRegistry() types.InterfaceRegistry
})
if !ok {
return fmt.Errorf("codec does not implement InterfaceRegistry")
}
interfaceRegistry := interfaceRegistryProvider.InterfaceRegistry()

// execute all messages in order
for i, anyMsg := range genesis.Messages {
msg, err := anyToMsg(interfaceRegistry, anyMsg)
if err != nil {
return fmt.Errorf("at index %d: message decoding: %w", i, err)
}
handler := router.Handler(msg)
if handler == nil {
return fmt.Errorf("at index %d: no handler for message %T %s", i, msg, msg)
}
resp, err := handler(context, msg)
if err != nil {
return fmt.Errorf("at index %d: message processing: %w", i, err)
}
log.Printf("message %d processed %s: %s", i, msg, resp.String())
}
return nil
}
110 changes: 110 additions & 0 deletions x/genmsg/genesis_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package genmsg

import (
"testing"

v1 "github.com/archway-network/archway/x/genmsg/v1"
"github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/codec/types"
sdk "github.com/cosmos/cosmos-sdk/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
"github.com/gogo/protobuf/proto"
"github.com/stretchr/testify/require"
)

type mockRouter struct {
handler func(msg sdk.Msg) baseapp.MsgServiceHandler
}

func (m mockRouter) Handler(msg sdk.Msg) baseapp.MsgServiceHandler { return m.handler(msg) }

func makeCodec(_ *testing.T) codec.JSONCodec {
ir := types.NewInterfaceRegistry()
cdc := codec.NewProtoCodec(ir)
ir.RegisterInterface(sdk.MsgInterfaceProtoName, (*sdk.Msg)(nil), &banktypes.MsgSend{})
return cdc
}

func newGenesisFromMsgs(t *testing.T, cdc codec.JSONCodec, msgs ...proto.Message) *v1.GenesisState {
genesis := new(v1.GenesisState)
for _, msg := range msgs {
anyProto, err := types.NewAnyWithValue(msg)
require.NoError(t, err)
genesis.Messages = append(genesis.Messages, anyProto)
}
genesisJSON, err := cdc.MarshalJSON(genesis)
require.NoError(t, err)
genesis = new(v1.GenesisState)
require.NoError(t, cdc.UnmarshalJSON(genesisJSON, genesis))
return genesis
}

func Test_initGenesis(t *testing.T) {
cdc := makeCodec(t)
ctx := sdk.Context{}

t.Run("works - no msgs", func(t *testing.T) {
r := mockRouter{func(msg sdk.Msg) baseapp.MsgServiceHandler {
return func(ctx sdk.Context, req sdk.Msg) (*sdk.Result, error) {
return &sdk.Result{}, nil
}
}}

err := initGenesis(ctx, cdc, r, newGenesisFromMsgs(t, cdc))
require.NoError(t, err)
})

t.Run("works - with message", func(t *testing.T) {
called := false
r := mockRouter{func(msg sdk.Msg) baseapp.MsgServiceHandler {
return func(ctx sdk.Context, req sdk.Msg) (*sdk.Result, error) {
called = true
return &sdk.Result{}, nil
}
}}

err := initGenesis(ctx, cdc, r, newGenesisFromMsgs(t, cdc, &banktypes.MsgSend{
FromAddress: sdk.AccAddress("a").String(),
ToAddress: sdk.AccAddress("b").String(),
Amount: sdk.NewCoins(sdk.NewInt64Coin("test", 1000)),
}))
require.NoError(t, err)
require.True(t, called)
})

t.Run("fails - handler is nil", func(t *testing.T) {
r := mockRouter{func(msg sdk.Msg) baseapp.MsgServiceHandler {
return nil
}}

err := initGenesis(ctx, cdc, r, newGenesisFromMsgs(t, cdc, &banktypes.MsgSend{
FromAddress: sdk.AccAddress("a").String(),
ToAddress: sdk.AccAddress("b").String(),
Amount: sdk.NewCoins(sdk.NewInt64Coin("test", 1000)),
}))
require.Error(t, err)
})
}

func Test_validateGenesis(t *testing.T) {
cdc := makeCodec(t)
t.Run("works - empty", func(t *testing.T) {
err := validateGenesis(cdc, &v1.GenesisState{})
require.NoError(t, err)
})
t.Run("works - with messages", func(t *testing.T) {
genesis := newGenesisFromMsgs(t, cdc, &banktypes.MsgSend{
FromAddress: sdk.AccAddress("sender").String(),
ToAddress: sdk.AccAddress("receiver").String(),
Amount: sdk.NewCoins(sdk.NewInt64Coin("test", 1000)),
})
err := validateGenesis(cdc, genesis)
require.NoError(t, err)
})
t.Run("fails - validate basic", func(t *testing.T) {
genesis := newGenesisFromMsgs(t, cdc, &banktypes.MsgSend{})
err := validateGenesis(cdc, genesis)
require.Error(t, err)
})
}
Loading