diff --git a/api/ethermint/evm/v1/tx.pulsar.go b/api/ethermint/evm/v1/tx.pulsar.go index 53f468920b..cb7a8d9f8d 100644 --- a/api/ethermint/evm/v1/tx.pulsar.go +++ b/api/ethermint/evm/v1/tx.pulsar.go @@ -6523,7 +6523,7 @@ var file_ethermint_evm_v1_tx_proto_rawDesc = []byte{ 0x6d, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x0e, 0x82, 0xe7, 0xb0, 0x2a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x19, 0x0a, 0x17, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xe2, 0x01, 0x0a, 0x03, + 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xe9, 0x01, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x7d, 0x0a, 0x0a, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x54, 0x78, 0x12, 0x1f, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, @@ -6538,18 +6538,18 @@ var file_ethermint_evm_v1_tx_proto_rawDesc = []byte{ 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x29, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x42, 0xaa, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x74, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x27, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, - 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, - 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x3b, 0x65, 0x76, 0x6d, 0x76, 0x31, 0xa2, 0x02, 0x03, - 0x45, 0x45, 0x58, 0xaa, 0x02, 0x10, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, - 0x45, 0x76, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x74, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x45, 0x74, 0x68, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x74, 0x3a, 0x3a, 0x45, 0x76, 0x6d, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0xaa, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x65, 0x76, 0x6d, 0x2e, 0x76, 0x31, + 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x27, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x76, 0x31, 0x3b, 0x65, + 0x76, 0x6d, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x45, 0x45, 0x58, 0xaa, 0x02, 0x10, 0x45, 0x74, 0x68, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x45, 0x76, 0x6d, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, + 0x45, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x5c, 0x45, 0x76, 0x6d, 0x5c, 0x56, 0x31, + 0xe2, 0x02, 0x1c, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x5c, 0x45, 0x76, 0x6d, + 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x12, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x3a, 0x3a, 0x45, 0x76, 0x6d, + 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/ethermint/feemarket/v1/feemarket.pulsar.go b/api/ethermint/feemarket/v1/feemarket.pulsar.go index e09abf0d9c..34a893e5d7 100644 --- a/api/ethermint/feemarket/v1/feemarket.pulsar.go +++ b/api/ethermint/feemarket/v1/feemarket.pulsar.go @@ -874,9 +874,9 @@ var file_ethermint_feemarket_v1_feemarket_proto_rawDesc = []byte{ 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x65, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x31, - 0x1a, 0x14, 0x67, 0x6f, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x1a, 0x19, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x67, 0x6f, 0x67, + 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcb, 0x03, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1e, 0x0a, 0x0b, 0x6e, 0x6f, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6e, 0x6f, 0x42, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x12, 0x3d, 0x0a, 0x1b, diff --git a/api/ethermint/feemarket/v1/tx.pulsar.go b/api/ethermint/feemarket/v1/tx.pulsar.go index 94daa29ce5..972732aeaa 100644 --- a/api/ethermint/feemarket/v1/tx.pulsar.go +++ b/api/ethermint/feemarket/v1/tx.pulsar.go @@ -983,27 +983,28 @@ var file_ethermint_feemarket_v1_tx_proto_rawDesc = []byte{ 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x0e, 0x82, 0xe7, 0xb0, 0x2a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x19, 0x0a, 0x17, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x32, 0x6f, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x68, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x32, 0x76, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x68, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x27, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x2f, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x42, 0xd4, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x31, - 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x33, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2f, 0x66, 0x65, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x66, 0x65, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x76, 0x31, - 0xa2, 0x02, 0x03, 0x45, 0x46, 0x58, 0xaa, 0x02, 0x16, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x74, 0x2e, 0x46, 0x65, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x56, 0x31, 0xca, - 0x02, 0x16, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x5c, 0x46, 0x65, 0x65, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x22, 0x45, 0x74, 0x68, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x74, 0x5c, 0x46, 0x65, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5c, 0x56, - 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, - 0x45, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x3a, 0x3a, 0x46, 0x65, 0x65, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0xd4, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, + 0x2e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x66, 0x65, 0x65, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x33, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2f, 0x66, + 0x65, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x66, 0x65, 0x65, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x45, 0x46, 0x58, 0xaa, 0x02, 0x16, + 0x45, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x2e, 0x46, 0x65, 0x65, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x16, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x74, 0x5c, 0x46, 0x65, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5c, 0x56, 0x31, 0xe2, + 0x02, 0x22, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x5c, 0x46, 0x65, 0x65, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, + 0x3a, 0x3a, 0x46, 0x65, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/app/ante/fee_checker_test.go b/app/ante/fee_checker_test.go index 4915376cae..da0255f26c 100644 --- a/app/ante/fee_checker_test.go +++ b/app/ante/fee_checker_test.go @@ -11,7 +11,6 @@ import ( tmproto "github.com/cometbft/cometbft/proto/tendermint/types" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" "github.com/ethereum/go-ethereum/params" "github.com/evmos/ethermint/encoding" @@ -52,7 +51,7 @@ func TestSDKTxFeeChecker(t *testing.T) { // with extension option // without extension option // london hardfork enableness - encodingConfig := encoding.MakeConfig(module.NewBasicManager()) + encodingConfig := encoding.MakeTestEncodingConfig() minGasPrices := sdk.NewDecCoins(sdk.NewDecCoin("aphoton", sdkmath.NewInt(10))) genesisCtx := sdk.NewContext(nil, tmproto.Header{}, false, log.NewNopLogger()) diff --git a/app/ante/utils_test.go b/app/ante/utils_test.go index 752240eff2..6a761af237 100644 --- a/app/ante/utils_test.go +++ b/app/ante/utils_test.go @@ -53,7 +53,6 @@ import ( "cosmossdk.io/x/feegrant" feegrantmodule "cosmossdk.io/x/feegrant/module" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" - sdktestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" "github.com/cosmos/cosmos-sdk/x/bank" govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" @@ -139,7 +138,7 @@ func (suite *AnteTestSuite) SetupTest() { acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr) suite.app.AccountKeeper.SetAccount(suite.ctx, acc) - encodingConfig := encoding.MakeConfig(app.ModuleBasics) + encodingConfig := encoding.MakeTestEncodingConfig(auth.AppModuleBasic{}, authzmodule.AppModuleBasic{}, bank.AppModuleBasic{}, evidence.AppModuleBasic{}, evm.AppModuleBasic{}, feegrantmodule.AppModuleBasic{}, gov.AppModuleBasic{}, staking.AppModuleBasic{}) // We're using TestMsg amino encoding in some tests, so register it here. encodingConfig.Amino.RegisterConcrete(&testdata.TestMsg{}, "testdata.TestMsg", nil) eip712.SetEncodingConfig(encodingConfig) @@ -180,8 +179,7 @@ func (suite *AnteTestSuite) SetupTest() { suite.ctx, err = testutil.Commit(suite.ctx, suite.app, time.Second*0, nil) suite.Require().NoError(err) - encCfg := sdktestutil.MakeTestEncodingConfig(auth.AppModuleBasic{}, authzmodule.AppModuleBasic{}, bank.AppModuleBasic{}, evidence.AppModuleBasic{}, evm.AppModuleBasic{}, feegrantmodule.AppModuleBasic{}, gov.AppModuleBasic{}, staking.AppModuleBasic{}) - legacytx.RegressionTestingAminoCodec = encCfg.Amino + legacytx.RegressionTestingAminoCodec = encodingConfig.Amino } func (s *AnteTestSuite) BuildTestEthTx( diff --git a/app/app.go b/app/app.go index 1a9c2adb3c..8f11a1c18b 100644 --- a/app/app.go +++ b/app/app.go @@ -17,8 +17,8 @@ package app import ( "encoding/json" + "fmt" "io" - "net/http" "os" "path/filepath" @@ -26,9 +26,9 @@ import ( reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1" runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services" - "github.com/gorilla/mux" - "github.com/rakyll/statik/fs" + "github.com/cosmos/gogoproto/proto" "github.com/spf13/cast" + protov2 "google.golang.org/protobuf/proto" abci "github.com/cometbft/cometbft/abci/types" tmos "github.com/cometbft/cometbft/libs/os" @@ -37,6 +37,8 @@ import ( "cosmossdk.io/core/appmodule" "cosmossdk.io/log" "cosmossdk.io/simapp" + circuitkeeper "cosmossdk.io/x/circuit/keeper" + nftkeeper "cosmossdk.io/x/nft/keeper" dbm "github.com/cosmos/cosmos-db" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" @@ -49,19 +51,29 @@ import ( "github.com/cosmos/cosmos-sdk/server/config" servertypes "github.com/cosmos/cosmos-sdk/server/types" + simappparams "cosmossdk.io/simapp/params" storetypes "cosmossdk.io/store/types" + "cosmossdk.io/x/circuit" + circuittypes "cosmossdk.io/x/circuit/types" "cosmossdk.io/x/evidence" evidencekeeper "cosmossdk.io/x/evidence/keeper" evidencetypes "cosmossdk.io/x/evidence/types" "cosmossdk.io/x/feegrant" feegrantkeeper "cosmossdk.io/x/feegrant/keeper" feegrantmodule "cosmossdk.io/x/feegrant/module" + "cosmossdk.io/x/nft" + nftmodule "cosmossdk.io/x/nft/module" + "cosmossdk.io/x/tx/signing" "cosmossdk.io/x/upgrade" upgradekeeper "cosmossdk.io/x/upgrade/keeper" upgradetypes "cosmossdk.io/x/upgrade/types" + "github.com/cosmos/cosmos-sdk/codec/address" + "github.com/cosmos/cosmos-sdk/server" + testdata_pulsar "github.com/cosmos/cosmos-sdk/testutil/testdata/testpb" sdk "github.com/cosmos/cosmos-sdk/types" mempool "github.com/cosmos/cosmos-sdk/types/mempool" "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/types/msgservice" "github.com/cosmos/cosmos-sdk/version" "github.com/cosmos/cosmos-sdk/x/auth" authcodec "github.com/cosmos/cosmos-sdk/x/auth/codec" @@ -93,6 +105,9 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + "github.com/cosmos/cosmos-sdk/x/group" + groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper" + groupmodule "github.com/cosmos/cosmos-sdk/x/group/module" "github.com/cosmos/cosmos-sdk/x/mint" mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" @@ -119,12 +134,14 @@ import ( porttypes "github.com/cosmos/ibc-go/v8/modules/core/05-port/types" ibcexported "github.com/cosmos/ibc-go/v8/modules/core/exported" ibckeeper "github.com/cosmos/ibc-go/v8/modules/core/keeper" - ibctm "github.com/cosmos/ibc-go/v8/modules/light-clients/07-tendermint" // unnamed import of statik for swagger UI support _ "github.com/evmos/ethermint/client/docs/statik" + evmv1 "github.com/evmos/ethermint/api/ethermint/evm/v1" + feemarketv1 "github.com/evmos/ethermint/api/ethermint/feemarket/v1" "github.com/evmos/ethermint/app/ante" + enccodec "github.com/evmos/ethermint/encoding/codec" "github.com/evmos/ethermint/ethereum/eip712" srvflags "github.com/evmos/ethermint/server/flags" ethermint "github.com/evmos/ethermint/types" @@ -139,56 +156,17 @@ import ( consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types" - simappparams "cosmossdk.io/simapp/params" // Force-load the tracer engines to trigger registration due to Go-Ethereum v1.10.15 changes _ "github.com/ethereum/go-ethereum/eth/tracers/js" _ "github.com/ethereum/go-ethereum/eth/tracers/native" ) -func init() { - userHomeDir, err := os.UserHomeDir() - if err != nil { - panic(err) - } - - DefaultNodeHome = filepath.Join(userHomeDir, ".ethermintd") -} - const appName = "ethermintd" var ( // DefaultNodeHome default home directories for the application daemon DefaultNodeHome string - // ModuleBasics defines the module BasicManager is in charge of setting up basic, - // non-dependant module elements, such as codec registration - // and genesis verification. - ModuleBasics = module.NewBasicManager( - auth.AppModuleBasic{}, - genutil.NewAppModuleBasic(genutiltypes.DefaultMessageValidator), - bank.AppModuleBasic{}, - capability.AppModuleBasic{}, - staking.AppModuleBasic{}, - mint.AppModuleBasic{}, - distr.AppModuleBasic{}, - gov.NewAppModuleBasic([]govclient.ProposalHandler{paramsclient.ProposalHandler}), - params.AppModuleBasic{}, - crisis.AppModuleBasic{}, - slashing.AppModuleBasic{}, - ibc.AppModuleBasic{}, - ibctm.AppModuleBasic{}, - authzmodule.AppModuleBasic{}, - feegrantmodule.AppModuleBasic{}, - upgrade.AppModuleBasic{}, - evidence.AppModuleBasic{}, - transfer.AppModuleBasic{}, - vesting.AppModuleBasic{}, - consensus.AppModuleBasic{}, - // Ethermint modules - evm.AppModuleBasic{}, - feemarket.AppModuleBasic{}, - ) - // module account permissions maccPerms = map[string][]string{ authtypes.FeeCollectorName: nil, @@ -199,6 +177,7 @@ var ( govtypes.ModuleName: {authtypes.Burner}, ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, evmtypes.ModuleName: {authtypes.Minter, authtypes.Burner}, // used for secure addition and subtraction of balance using module account + nft.ModuleName: nil, } // module accounts that are allowed to receive tokens @@ -210,21 +189,16 @@ var ( _ servertypes.Application = (*EthermintApp)(nil) ) -// var _ server.Application (*EthermintApp)(nil) - // EthermintApp implements an extended ABCI application. It is an application // that may process transactions through Ethereum's EVM running atop of // Tendermint consensus. type EthermintApp struct { *baseapp.BaseApp - - // encoding - cdc *codec.LegacyAmino + legacyAmino *codec.LegacyAmino appCodec codec.Codec + txConfig client.TxConfig interfaceRegistry types.InterfaceRegistry - invCheckPeriod uint - // keys to access the substores keys map[string]*storetypes.KVStoreKey tkeys map[string]*storetypes.TransientStoreKey @@ -232,8 +206,7 @@ type EthermintApp struct { // keepers AccountKeeper authkeeper.AccountKeeper - BankKeeper bankkeeper.Keeper - CapabilityKeeper *capabilitykeeper.Keeper + BankKeeper bankkeeper.BaseKeeper StakingKeeper *stakingkeeper.Keeper SlashingKeeper slashingkeeper.Keeper MintKeeper mintkeeper.Keeper @@ -242,13 +215,17 @@ type EthermintApp struct { CrisisKeeper *crisiskeeper.Keeper UpgradeKeeper *upgradekeeper.Keeper ParamsKeeper paramskeeper.Keeper - FeeGrantKeeper feegrantkeeper.Keeper AuthzKeeper authzkeeper.Keeper + EvidenceKeeper evidencekeeper.Keeper + FeeGrantKeeper feegrantkeeper.Keeper + GroupKeeper groupkeeper.Keeper + NFTKeeper nftkeeper.Keeper + ConsensusParamsKeeper consensusparamkeeper.Keeper + CircuitKeeper circuitkeeper.Keeper IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly IBCFeeKeeper ibcfeekeeper.Keeper - EvidenceKeeper evidencekeeper.Keeper TransferKeeper ibctransferkeeper.Keeper - ConsensusParamsKeeper consensusparamkeeper.Keeper + CapabilityKeeper *capabilitykeeper.Keeper // make scoped keepers public for test purposes ScopedIBCKeeper capabilitykeeper.ScopedKeeper @@ -259,18 +236,23 @@ type EthermintApp struct { FeeMarketKeeper feemarketkeeper.Keeper // the module manager - mm *module.Manager - - // the configurator - configurator module.Configurator + ModuleManager *module.Manager + BasicModuleManager module.BasicManager // simulation manager sm *module.SimulationManager + + // the configurator + configurator module.Configurator } -// SimulationManager implements runtime.AppI -func (*EthermintApp) SimulationManager() *module.SimulationManager { - panic("unimplemented") +func init() { + userHomeDir, err := os.UserHomeDir() + if err != nil { + panic(err) + } + + DefaultNodeHome = filepath.Join(userHomeDir, ".ethermintd") } // NewEthermintApp returns a reference to a new initialized Ethermint application. @@ -282,17 +264,50 @@ func NewEthermintApp( skipUpgradeHeights map[int64]bool, homePath string, invCheckPeriod uint, - encodingConfig simappparams.EncodingConfig, appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), ) *EthermintApp { - appCodec := encodingConfig.Codec legacyAmino := codec.NewLegacyAmino() - cdc := encodingConfig.Amino - interfaceRegistry := encodingConfig.InterfaceRegistry + signingOptions := signing.Options{ + AddressCodec: address.Bech32Codec{ + Bech32Prefix: sdk.GetConfig().GetBech32AccountAddrPrefix(), + }, + ValidatorAddressCodec: address.Bech32Codec{ + Bech32Prefix: sdk.GetConfig().GetBech32ValidatorAddrPrefix(), + }, + } + + // evm/MsgEthereumTx, evm/MsgUpdateParams, feemarket/MsgUpdateParams + signingOptions.DefineCustomGetSigners(protov2.MessageName(&evmv1.MsgEthereumTx{}), evmtypes.GetSignersFromMsgEthereumTxV2) + signingOptions.DefineCustomGetSigners(protov2.MessageName(&evmv1.MsgUpdateParams{}), evmtypes.GetSignersFromMsgUpdateParamsV2) + signingOptions.DefineCustomGetSigners(protov2.MessageName(&feemarketv1.MsgUpdateParams{}), feemarkettypes.GetSignersFromMsgUpdateParamsV2) + + interfaceRegistry, _ := types.NewInterfaceRegistryWithOptions(types.InterfaceRegistryOptions{ + ProtoFiles: proto.HybridResolver, + SigningOptions: signingOptions, + }) + appCodec := codec.NewProtoCodec(interfaceRegistry) + txConfig := authtx.NewTxConfig(appCodec, authtx.DefaultSignModes) + + encodingConfig := simappparams.EncodingConfig{ + InterfaceRegistry: interfaceRegistry, + Codec: appCodec, + TxConfig: authtx.NewTxConfig(appCodec, authtx.DefaultSignModes), + Amino: legacyAmino, + } + + enccodec.RegisterLegacyAminoCodec(legacyAmino) + enccodec.RegisterInterfaces(interfaceRegistry) eip712.SetEncodingConfig(encodingConfig) + // create and set dummy vote extension handler + voteExtOp := func(bApp *baseapp.BaseApp) { + voteExtHandler := simapp.NewVoteExtensionHandler() + voteExtHandler.SetHandlers(bApp) + } + baseAppOptions = append(baseAppOptions, voteExtOp, baseapp.SetOptimisticExecution()) + // NOTE we use custom transaction decoder that supports the sdk.Tx interface instead of sdk.StdTx // Setup Mempool and Proposal Handlers baseAppOptions = append(baseAppOptions, func(app *baseapp.BaseApp) { @@ -302,58 +317,51 @@ func NewEthermintApp( app.SetPrepareProposal(handler.PrepareProposalHandler()) app.SetProcessProposal(handler.ProcessProposalHandler()) }) - bApp := baseapp.NewBaseApp( - appName, - logger, - db, - encodingConfig.TxConfig.TxDecoder(), - baseAppOptions..., - ) + + bApp := baseapp.NewBaseApp(appName, logger, db, txConfig.TxDecoder(), baseAppOptions...) bApp.SetCommitMultiStoreTracer(traceStore) bApp.SetVersion(version.Version) bApp.SetInterfaceRegistry(interfaceRegistry) + bApp.SetTxEncoder(txConfig.TxEncoder()) keys := storetypes.NewKVStoreKeys( // SDK keys - authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, + authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, crisistypes.StoreKey, minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey, - govtypes.StoreKey, paramstypes.StoreKey, upgradetypes.StoreKey, - evidencetypes.StoreKey, capabilitytypes.StoreKey, consensusparamtypes.StoreKey, - feegrant.StoreKey, authzkeeper.StoreKey, crisistypes.StoreKey, + govtypes.StoreKey, paramstypes.StoreKey, consensusparamtypes.StoreKey, upgradetypes.StoreKey, feegrant.StoreKey, + evidencetypes.StoreKey, circuittypes.StoreKey, + authzkeeper.StoreKey, nftkeeper.StoreKey, group.StoreKey, // ibc keys - ibcexported.StoreKey, ibctransfertypes.StoreKey, + ibcexported.StoreKey, ibctransfertypes.StoreKey, capabilitytypes.StoreKey, // ethermint keys evmtypes.StoreKey, feemarkettypes.StoreKey, ) - // Add the EVM transient store key - tkeys := storetypes.NewTransientStoreKeys(paramstypes.TStoreKey, evmtypes.TransientKey, feemarkettypes.TransientKey) - memKeys := storetypes.NewMemoryStoreKeys(capabilitytypes.MemStoreKey) - // register streaming services if err := bApp.RegisterStreamingServices(appOpts, keys); err != nil { panic(err) } + // Add the EVM transient store key + tkeys := storetypes.NewTransientStoreKeys(paramstypes.TStoreKey, evmtypes.TransientKey, feemarkettypes.TransientKey) + memKeys := storetypes.NewMemoryStoreKeys(capabilitytypes.MemStoreKey) app := &EthermintApp{ BaseApp: bApp, - cdc: cdc, + legacyAmino: legacyAmino, appCodec: appCodec, + txConfig: txConfig, interfaceRegistry: interfaceRegistry, - invCheckPeriod: invCheckPeriod, keys: keys, tkeys: tkeys, memKeys: memKeys, } // init params keeper and subspaces - app.ParamsKeeper = initParamsKeeper(appCodec, cdc, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey]) - - // get authority address - authAddr := authtypes.NewModuleAddress(govtypes.ModuleName).String() + app.ParamsKeeper = initParamsKeeper(appCodec, legacyAmino, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey]) // set the BaseApp's parameter store - app.ConsensusParamsKeeper = consensusparamkeeper.NewKeeper(appCodec, + app.ConsensusParamsKeeper = consensusparamkeeper.NewKeeper( + appCodec, runtime.NewKVStoreService(keys[consensusparamtypes.StoreKey]), authtypes.NewModuleAddress(govtypes.ModuleName).String(), runtime.EventService{}, @@ -384,10 +392,26 @@ func NewEthermintApp( appCodec, runtime.NewKVStoreService(keys[banktypes.StoreKey]), app.AccountKeeper, - BlockedAddresses(), + app.BlockedAddrs(), authtypes.NewModuleAddress(govtypes.ModuleName).String(), logger, ) + + // optional: enable sign mode textual by overwriting the default tx config (after setting the bank keeper) + // enabledSignModes := append(tx.DefaultSignModes, sigtypes.SignMode_SIGN_MODE_TEXTUAL) + // txConfigOpts := tx.ConfigOptions{ + // EnabledSignModes: enabledSignModes, + // TextualCoinMetadataQueryFn: txmodule.NewBankKeeperCoinMetadataQueryFn(app.BankKeeper), + // } + // txConfig, err := tx.NewTxConfigWithOptions( + // appCodec, + // txConfigOpts, + // ) + // if err != nil { + // panic(err) + // } + // app.txConfig = txConfig + app.StakingKeeper = stakingkeeper.NewKeeper( appCodec, runtime.NewKVStoreService(keys[stakingtypes.StoreKey]), @@ -427,7 +451,7 @@ func NewEthermintApp( invCheckPeriod, app.BankKeeper, authtypes.FeeCollectorName, - authAddr, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), app.AccountKeeper.AddressCodec(), ) app.FeeGrantKeeper = feegrantkeeper.NewKeeper( @@ -436,22 +460,20 @@ func NewEthermintApp( app.AccountKeeper, ) - // set the governance module account as the authority for conducting upgrades - app.UpgradeKeeper = upgradekeeper.NewKeeper( - skipUpgradeHeights, - runtime.NewKVStoreService(keys[upgradetypes.StoreKey]), - appCodec, - homePath, - app.BaseApp, - authAddr, - ) - // register the staking hooks app.StakingKeeper.SetHooks( stakingtypes.NewMultiStakingHooks(app.DistrKeeper.Hooks(), app.SlashingKeeper.Hooks()), ) + app.CircuitKeeper = circuitkeeper.NewKeeper( + appCodec, + runtime.NewKVStoreService(keys[circuittypes.StoreKey]), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + app.AccountKeeper.AddressCodec(), + ) + app.BaseApp.SetCircuitBreaker(&app.CircuitKeeper) + app.AuthzKeeper = authzkeeper.NewKeeper( runtime.NewKVStoreService(keys[authzkeeper.StoreKey]), appCodec, @@ -459,31 +481,20 @@ func NewEthermintApp( app.AccountKeeper, ) - tracer := cast.ToString(appOpts.Get(srvflags.EVMTracer)) - - // Create Ethermint keepers - feeMarketSs := app.GetSubspace(feemarkettypes.ModuleName) - app.FeeMarketKeeper = feemarketkeeper.NewKeeper( - appCodec, authtypes.NewModuleAddress(govtypes.ModuleName), - runtime.NewKVStoreService(keys[feemarkettypes.StoreKey]), tkeys[feemarkettypes.TransientKey], feeMarketSs, - ) - - // Set authority to x/gov module account to only expect the module account to update params - evmSs := app.GetSubspace(evmtypes.ModuleName) - app.EvmKeeper = evmkeeper.NewKeeper( - appCodec, runtime.NewKVStoreService(keys[evmtypes.StoreKey]), tkeys[evmtypes.TransientKey], authtypes.NewModuleAddress(govtypes.ModuleName), - app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.FeeMarketKeeper, - nil, geth.NewEVM, tracer, evmSs, - ) + groupConfig := group.DefaultConfig() + /* + Example of setting group params: + groupConfig.MaxMetadataLen = 1000 + */ + app.GroupKeeper = groupkeeper.NewKeeper(keys[group.StoreKey], appCodec, app.MsgServiceRouter(), app.AccountKeeper, groupConfig) - // Create IBC Keeper - app.IBCKeeper = ibckeeper.NewKeeper( + // set the governance module account as the authority for conducting upgrades + app.UpgradeKeeper = upgradekeeper.NewKeeper( + skipUpgradeHeights, + runtime.NewKVStoreService(keys[upgradetypes.StoreKey]), appCodec, - keys[ibcexported.StoreKey], - app.GetSubspace(ibcexported.ModuleName), - app.StakingKeeper, - app.UpgradeKeeper, - scopedIBCKeeper, + homePath, + app.BaseApp, authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) @@ -491,7 +502,6 @@ func NewEthermintApp( govRouter := govv1beta1.NewRouter() govRouter.AddRoute(govtypes.RouterKey, govv1beta1.ProposalHandler). AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)) - govConfig := govtypes.DefaultConfig() /* Example of setting gov params: @@ -518,6 +528,36 @@ func NewEthermintApp( ), ) + app.NFTKeeper = nftkeeper.NewKeeper( + runtime.NewKVStoreService(keys[nftkeeper.StoreKey]), + appCodec, + app.AccountKeeper, + app.BankKeeper, + ) + + // create evidence keeper with router + evidenceKeeper := evidencekeeper.NewKeeper( + appCodec, + runtime.NewKVStoreService(keys[evidencetypes.StoreKey]), + app.StakingKeeper, + app.SlashingKeeper, + app.AccountKeeper.AddressCodec(), + runtime.ProvideCometInfoService(), + ) + // If evidence needs to be handled for the app, set routes in router here and seal + app.EvidenceKeeper = *evidenceKeeper + + // Create IBC Keeper + app.IBCKeeper = ibckeeper.NewKeeper( + appCodec, + keys[ibcexported.StoreKey], + app.GetSubspace(ibcexported.ModuleName), + app.StakingKeeper, + app.UpgradeKeeper, + scopedIBCKeeper, + authtypes.NewModuleAddress(govtypes.ModuleName).String(), + ) + // Create Transfer Keepers app.TransferKeeper = ibctransferkeeper.NewKeeper( appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), @@ -534,17 +574,21 @@ func NewEthermintApp( ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferIBCModule) app.IBCKeeper.SetRouter(ibcRouter) - // create evidence keeper with router - evidenceKeeper := evidencekeeper.NewKeeper( - appCodec, - runtime.NewKVStoreService(keys[evidencetypes.StoreKey]), - app.StakingKeeper, - app.SlashingKeeper, - app.AccountKeeper.AddressCodec(), - runtime.ProvideCometInfoService(), + // Create Ethermint keepers + feeMarketSs := app.GetSubspace(feemarkettypes.ModuleName) + app.FeeMarketKeeper = feemarketkeeper.NewKeeper( + appCodec, authtypes.NewModuleAddress(govtypes.ModuleName), + runtime.NewKVStoreService(keys[feemarkettypes.StoreKey]), tkeys[feemarkettypes.TransientKey], feeMarketSs, + ) + + // Set authority to x/gov module account to only expect the module account to update params + tracer := cast.ToString(appOpts.Get(srvflags.EVMTracer)) + evmSs := app.GetSubspace(evmtypes.ModuleName) + app.EvmKeeper = evmkeeper.NewKeeper( + appCodec, runtime.NewKVStoreService(keys[evmtypes.StoreKey]), tkeys[evmtypes.TransientKey], authtypes.NewModuleAddress(govtypes.ModuleName), + app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.FeeMarketKeeper, + nil, geth.NewEVM, tracer, evmSs, ) - // If evidence needs to be handled for the app, set routes in router here and seal - app.EvidenceKeeper = *evidenceKeeper /**** Module Options ****/ @@ -554,56 +598,69 @@ func NewEthermintApp( // NOTE: Any module instantiated in the module manager that is later modified // must be passed by reference here. - app.mm = module.NewManager( + app.ModuleManager = module.NewManager( // SDK app modules genutil.NewAppModule( app.AccountKeeper, app.StakingKeeper, app, - encodingConfig.TxConfig, + txConfig, ), auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)), - capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), crisis.NewAppModule(app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), gov.NewAppModule(appCodec, &app.GovKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(govtypes.ModuleName)), mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil, app.GetSubspace(minttypes.ModuleName)), - slashing.NewAppModule( - appCodec, - app.SlashingKeeper, - app.AccountKeeper, - app.BankKeeper, - app.StakingKeeper, - app.GetSubspace(slashingtypes.ModuleName), - app.interfaceRegistry, - ), + slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(slashingtypes.ModuleName), app.interfaceRegistry), distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(distrtypes.ModuleName)), staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName)), upgrade.NewAppModule(app.UpgradeKeeper, app.AccountKeeper.AddressCodec()), evidence.NewAppModule(app.EvidenceKeeper), params.NewAppModule(app.ParamsKeeper), authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), + groupmodule.NewAppModule(appCodec, app.GroupKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), + nftmodule.NewAppModule(appCodec, app.NFTKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), consensus.NewAppModule(appCodec, app.ConsensusParamsKeeper), + circuit.NewAppModule(appCodec, app.CircuitKeeper), // ibc modules ibc.NewAppModule(app.IBCKeeper), transferModule, + capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), + // Ethermint app modules feemarket.NewAppModule(app.FeeMarketKeeper, feeMarketSs), evm.NewAppModule(app.EvmKeeper, app.AccountKeeper, evmSs), ) - app.mm.SetOrderPreBlockers( + // BasicModuleManager defines the module BasicManager is in charge of setting up basic, + // non-dependant module elements, such as codec registration and genesis verification. + // By default it is composed of all the module from the module manager. + // Additionally, app module basics can be overwritten by passing them as argument. + app.BasicModuleManager = module.NewBasicManagerFromManager( + app.ModuleManager, + map[string]module.AppModuleBasic{ + genutiltypes.ModuleName: genutil.NewAppModuleBasic(genutiltypes.DefaultMessageValidator), + govtypes.ModuleName: gov.NewAppModuleBasic( + []govclient.ProposalHandler{ + paramsclient.ProposalHandler, + }, + ), + }) + app.BasicModuleManager.RegisterLegacyAminoCodec(legacyAmino) + app.BasicModuleManager.RegisterInterfaces(interfaceRegistry) + + // NOTE: upgrade module is required to be prioritized + app.ModuleManager.SetOrderPreBlockers( upgradetypes.ModuleName, ) - // During begin block slashing happens after distr.BeginBlocker so that // there is nothing left over in the validator fee pool, so as to keep the // CanWithdrawInvariant invariant. // NOTE: upgrade module must go first to handle software upgrades. // NOTE: staking module is required if HistoricalEntries param > 0 // NOTE: capability module's beginblocker must come before any modules using capabilities (e.g. IBC) - app.mm.SetOrderBeginBlockers( + app.ModuleManager.SetOrderBeginBlockers( // TODO(dudong2): maybe remove no-op modules capabilitytypes.ModuleName, feemarkettypes.ModuleName, evmtypes.ModuleName, @@ -628,7 +685,7 @@ func NewEthermintApp( ) // NOTE: fee market module must go last in order to retrieve the block gas used. - app.mm.SetOrderEndBlockers( + app.ModuleManager.SetOrderEndBlockers( crisistypes.ModuleName, govtypes.ModuleName, stakingtypes.ModuleName, @@ -651,6 +708,7 @@ func NewEthermintApp( upgradetypes.ModuleName, vestingtypes.ModuleName, consensusparamtypes.ModuleName, + group.ModuleName, ) // NOTE: The genutils module must occur after staking so that pools are @@ -659,7 +717,7 @@ func NewEthermintApp( // NOTE: Capability module must occur first so that it can initialize any capabilities // so that other modules that want to create or claim capabilities afterwards in InitChain // can do so safely. - app.mm.SetOrderInitGenesis( + genesisModuleOrder := []string{ // SDK modules capabilitytypes.ModuleName, authtypes.ModuleName, @@ -680,30 +738,43 @@ func NewEthermintApp( ibctransfertypes.ModuleName, authz.ModuleName, feegrant.ModuleName, + nft.ModuleName, + group.ModuleName, paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, consensusparamtypes.ModuleName, + circuittypes.ModuleName, // NOTE: crisis module must go at the end to check for invariants on each module crisistypes.ModuleName, - ) + } + app.ModuleManager.SetOrderInitGenesis(genesisModuleOrder...) + app.ModuleManager.SetOrderExportGenesis(genesisModuleOrder...) // Uncomment if you want to set a custom migration order here. - // app.mm.SetOrderMigrations(custom order) + // app.ModuleManager.SetOrderMigrations(custom order) - app.mm.RegisterInvariants(app.CrisisKeeper) + app.ModuleManager.RegisterInvariants(app.CrisisKeeper) app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) - err := app.mm.RegisterServices(app.configurator) + err := app.ModuleManager.RegisterServices(app.configurator) if err != nil { panic(err) } // RegisterUpgradeHandlers is used for registering any on-chain upgrades. // Make sure it's called after `app.mm` and `app.configurator` are set. - app.RegisterUpgradeHandlers(app.appCodec, app.IBCKeeper.ClientKeeper, app.ConsensusParamsKeeper) + app.RegisterUpgradeHandlers(app.appCodec, app.IBCKeeper.ClientKeeper, app.ConsensusParamsKeeper) // TODO(dudong2): consider it + + autocliv1.RegisterQueryServer(app.GRPCQueryRouter(), runtimeservices.NewAutoCLIQueryService(app.ModuleManager.Modules)) + + reflectionSvc, err := runtimeservices.NewReflectionService() + if err != nil { + panic(err) + } + reflectionv1.RegisterReflectionServiceServer(app.GRPCQueryRouter(), reflectionSvc) // add test gRPC service for testing gRPC queries in isolation - // testdata.RegisterTestServiceServer(app.GRPCQueryRouter(), testdata.TestServiceImpl{}) + testdata_pulsar.RegisterQueryServer(app.GRPCQueryRouter(), testdata_pulsar.QueryImpl{}) // create the simulation manager and define the order of the modules for deterministic simulations // @@ -712,15 +783,7 @@ func NewEthermintApp( overrideModules := map[string]module.AppModuleSimulation{ authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), } - app.sm = module.NewSimulationManagerFromAppModules(app.mm.Modules, overrideModules) - - autocliv1.RegisterQueryServer(app.GRPCQueryRouter(), runtimeservices.NewAutoCLIQueryService(app.mm.Modules)) - - reflectionSvc, err := runtimeservices.NewReflectionService() - if err != nil { - panic(err) - } - reflectionv1.RegisterReflectionServiceServer(app.GRPCQueryRouter(), reflectionSvc) + app.sm = module.NewSimulationManagerFromAppModules(app.ModuleManager.Modules, overrideModules) app.sm.RegisterStoreDecoders() @@ -734,7 +797,8 @@ func NewEthermintApp( app.SetBeginBlocker(app.BeginBlocker) app.SetPreBlocker(app.PreBlocker) app.SetEndBlocker(app.EndBlocker) - app.setAnteHandler(encodingConfig.TxConfig, cast.ToUint64(appOpts.Get(srvflags.EVMMaxTxGasWanted))) + app.setAnteHandler(txConfig, cast.ToUint64(appOpts.Get(srvflags.EVMMaxTxGasWanted))) + // In v0.46, the SDK introduces _postHandlers_. PostHandlers are like // antehandlers, but are run _after_ the `runMsgs` execution. They are also // defined as a chain, and have the same signature as antehandlers. @@ -750,6 +814,19 @@ func NewEthermintApp( // upgrade. app.setPostHandler() + // At startup, after all modules have been registered, check that all prot + // annotations are correct. + protoFiles, err := proto.MergedRegistry() + if err != nil { + panic(err) + } + err = msgservice.ValidateProtoAnnotations(protoFiles) + if err != nil { + // Once we switch to using protoreflect-based antehandlers, we might + // want to panic here instead of logging a warning. + fmt.Fprintln(os.Stderr, err.Error()) + } + if loadLatest { if err := app.LoadLatestVersion(); err != nil { tmos.Exit(err.Error()) @@ -764,23 +841,25 @@ func NewEthermintApp( // use Ethermint's custom AnteHandler func (app *EthermintApp) setAnteHandler(txConfig client.TxConfig, maxGasWanted uint64) { - anteHandler, err := ante.NewAnteHandler(ante.HandlerOptions{ - AccountKeeper: app.AccountKeeper, - BankKeeper: app.BankKeeper, - SignModeHandler: txConfig.SignModeHandler(), - FeegrantKeeper: app.FeeGrantKeeper, - SigGasConsumer: ante.DefaultSigVerificationGasConsumer, - IBCKeeper: app.IBCKeeper, - EvmKeeper: app.EvmKeeper, - FeeMarketKeeper: app.FeeMarketKeeper, - MaxTxGasWanted: maxGasWanted, - ExtensionOptionChecker: ethermint.HasDynamicFeeExtensionOption, - TxFeeChecker: ante.NewDynamicFeeChecker(app.EvmKeeper), - DisabledAuthzMsgs: []string{ - sdk.MsgTypeURL(&evmtypes.MsgEthereumTx{}), - sdk.MsgTypeURL(&vestingtypes.MsgCreateVestingAccount{}), + anteHandler, err := ante.NewAnteHandler( + ante.HandlerOptions{ + AccountKeeper: app.AccountKeeper, + BankKeeper: app.BankKeeper, + SignModeHandler: txConfig.SignModeHandler(), + FeegrantKeeper: app.FeeGrantKeeper, + SigGasConsumer: ante.DefaultSigVerificationGasConsumer, + IBCKeeper: app.IBCKeeper, + EvmKeeper: app.EvmKeeper, + FeeMarketKeeper: app.FeeMarketKeeper, + MaxTxGasWanted: maxGasWanted, + ExtensionOptionChecker: ethermint.HasDynamicFeeExtensionOption, + TxFeeChecker: ante.NewDynamicFeeChecker(app.EvmKeeper), + DisabledAuthzMsgs: []string{ + sdk.MsgTypeURL(&evmtypes.MsgEthereumTx{}), + sdk.MsgTypeURL(&vestingtypes.MsgCreateVestingAccount{}), + }, }, - }) + ) if err != nil { panic(err) } @@ -804,17 +883,21 @@ func (app *EthermintApp) Name() string { return app.BaseApp.Name() } // PreBlocker updates every pre begin block func (app *EthermintApp) PreBlocker(ctx sdk.Context, _ *abci.RequestFinalizeBlock) (*sdk.ResponsePreBlock, error) { - return app.mm.PreBlock(ctx) + return app.ModuleManager.PreBlock(ctx) } // BeginBlocker updates every begin block func (app *EthermintApp) BeginBlocker(ctx sdk.Context) (sdk.BeginBlock, error) { - return app.mm.BeginBlock(ctx) + return app.ModuleManager.BeginBlock(ctx) } // EndBlocker updates every end block func (app *EthermintApp) EndBlocker(ctx sdk.Context) (sdk.EndBlock, error) { - return app.mm.EndBlock(ctx) + return app.ModuleManager.EndBlock(ctx) +} + +func (app *EthermintApp) Configurator() module.Configurator { + return app.configurator } // InitChainer updates at chain initialization @@ -823,10 +906,10 @@ func (app *EthermintApp) InitChainer(ctx sdk.Context, req *abci.RequestInitChain if err := json.Unmarshal(req.AppStateBytes, &genesisState); err != nil { panic(err) } - if err := app.UpgradeKeeper.SetModuleVersionMap(ctx, app.mm.GetVersionMap()); err != nil { + if err := app.UpgradeKeeper.SetModuleVersionMap(ctx, app.ModuleManager.GetVersionMap()); err != nil { panic(err) } - return app.mm.InitGenesis(ctx, app.appCodec, genesisState) + return app.ModuleManager.InitGenesis(ctx, app.appCodec, genesisState) } // LoadHeight loads state at a particular height @@ -844,23 +927,12 @@ func (app *EthermintApp) ModuleAccountAddrs() map[string]bool { return modAccAddrs } -// BlockedAddrs returns all the app's module account addresses that are not -// allowed to receive external tokens. -func (app *EthermintApp) BlockedAddrs() map[string]bool { - blockedAddrs := make(map[string]bool) - for acc := range maccPerms { - blockedAddrs[authtypes.NewModuleAddress(acc).String()] = !allowedReceivingModAcc[acc] - } - - return blockedAddrs -} - // LegacyAmino returns EthermintApp's amino codec. // // NOTE: This is solely to be used for testing purposes as it may be desirable // for modules to register their own custom testing types. func (app *EthermintApp) LegacyAmino() *codec.LegacyAmino { - return app.cdc + return app.legacyAmino } // AppCodec returns EthermintApp's app codec. @@ -876,10 +948,15 @@ func (app *EthermintApp) InterfaceRegistry() types.InterfaceRegistry { return app.interfaceRegistry } +// TxConfig returns EthermintApp's TxConfig +func (app *EthermintApp) TxConfig() client.TxConfig { + return app.txConfig +} + // AutoCliOpts returns the autocli options for the app. func (app *EthermintApp) AutoCliOpts() autocli.AppOptions { modules := make(map[string]appmodule.AppModule, 0) - for _, m := range app.mm.Modules { + for _, m := range app.ModuleManager.Modules { if moduleWithName, ok := m.(module.HasName); ok { moduleName := moduleWithName.Name() if appModule, ok := moduleWithName.(appmodule.AppModule); ok { @@ -890,13 +967,18 @@ func (app *EthermintApp) AutoCliOpts() autocli.AppOptions { return autocli.AppOptions{ Modules: modules, - ModuleOptions: runtimeservices.ExtractAutoCLIOptions(app.mm.Modules), + ModuleOptions: runtimeservices.ExtractAutoCLIOptions(app.ModuleManager.Modules), AddressCodec: authcodec.NewBech32Codec(sdk.GetConfig().GetBech32AccountAddrPrefix()), ValidatorAddressCodec: authcodec.NewBech32Codec(sdk.GetConfig().GetBech32ValidatorAddrPrefix()), ConsensusAddressCodec: authcodec.NewBech32Codec(sdk.GetConfig().GetBech32ConsensusAddrPrefix()), } } +// DefaultGenesis returns a default genesis from the registered AppModuleBasic's. +func (a *EthermintApp) DefaultGenesis() map[string]json.RawMessage { + return a.BasicModuleManager.DefaultGenesis(a.appCodec) +} + // GetKey returns the KVStoreKey for the provided store key. // // NOTE: This is solely to be used for testing purposes. @@ -904,6 +986,16 @@ func (app *EthermintApp) GetKey(storeKey string) *storetypes.KVStoreKey { return app.keys[storeKey] } +// GetStoreKeys returns all the stored store keys. +func (app *EthermintApp) GetStoreKeys() []storetypes.StoreKey { + keys := make([]storetypes.StoreKey, len(app.keys)) + for _, key := range app.keys { + keys = append(keys, key) + } + + return keys +} + // GetTKey returns the TransientStoreKey for the provided store key. // // NOTE: This is solely to be used for testing purposes. @@ -926,23 +1018,30 @@ func (app *EthermintApp) GetSubspace(moduleName string) paramstypes.Subspace { return subspace } +// SimulationManager implements runtime.AppI +func (app *EthermintApp) SimulationManager() *module.SimulationManager { + return app.sm +} + // RegisterAPIRoutes registers all application module routes with the provided // API server. func (app *EthermintApp) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { clientCtx := apiSvr.ClientCtx // Register new tx routes from grpc-gateway. authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + // Register new tendermint queries routes from grpc-gateway. cmtservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + // Register node gRPC service for grpc-gateway. node.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // Register grpc-gateway routes for all modules. - ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + app.BasicModuleManager.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // register swagger API from root so that other applications can override easily - if apiConfig.Swagger { - RegisterSwaggerAPI(clientCtx, apiSvr.Router) + if err := server.RegisterSwaggerAPI(apiSvr.ClientCtx, apiSvr.Router, apiConfig.Swagger); err != nil { // TODO(dudong2): need to check swagger server + panic(err) } } @@ -965,17 +1064,6 @@ func (app *EthermintApp) RegisterNodeService(clientCtx client.Context, cfg confi node.RegisterNodeService(clientCtx, app.GRPCQueryRouter(), cfg) } -// RegisterSwaggerAPI registers swagger route with API Server -func RegisterSwaggerAPI(_ client.Context, rtr *mux.Router) { - statikFS, err := fs.New() - if err != nil { - panic(err) - } - - staticServer := http.FileServer(statikFS) - rtr.PathPrefix("/swagger/").Handler(http.StripPrefix("/swagger/", staticServer)) -} - // GetMaccPerms returns a copy of the module account permissions func GetMaccPerms() map[string][]string { dupMaccPerms := make(map[string][]string) @@ -985,17 +1073,15 @@ func GetMaccPerms() map[string][]string { return dupMaccPerms } -// BlockedAddresses returns all the app's blocked account addresses. -func BlockedAddresses() map[string]bool { - modAccAddrs := make(map[string]bool) - for acc := range GetMaccPerms() { - modAccAddrs[authtypes.NewModuleAddress(acc).String()] = true +// BlockedAddrs returns all the app's module account addresses that are not +// allowed to receive external tokens. +func (app *EthermintApp) BlockedAddrs() map[string]bool { + blockedAddrs := make(map[string]bool) + for acc := range maccPerms { + blockedAddrs[authtypes.NewModuleAddress(acc).String()] = !allowedReceivingModAcc[acc] } - // allow the following addresses to receive funds - delete(modAccAddrs, authtypes.NewModuleAddress(govtypes.ModuleName).String()) - - return modAccAddrs + return blockedAddrs } // initParamsKeeper init params keeper and its subspaces diff --git a/app/app_test.go b/app/app_test.go index b0b9e859dc..60cb135e77 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -12,7 +12,6 @@ import ( "github.com/cosmos/cosmos-sdk/baseapp" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" - "github.com/evmos/ethermint/encoding" ) func TestEthermintAppExport(t *testing.T) { @@ -35,7 +34,6 @@ func TestEthermintAppExport(t *testing.T) { map[int64]bool{}, DefaultNodeHome, 0, - encoding.MakeConfig(ModuleBasics), simtestutil.NewAppOptionsWithFlagHome(DefaultNodeHome), baseapp.SetChainID(ChainID), ) diff --git a/app/benchmark_test.go b/app/benchmark_test.go index 6fa3372ef6..477f6f634a 100644 --- a/app/benchmark_test.go +++ b/app/benchmark_test.go @@ -10,7 +10,6 @@ import ( dbm "github.com/cosmos/cosmos-db" "github.com/cosmos/cosmos-sdk/baseapp" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" - "github.com/evmos/ethermint/encoding" ) func BenchmarkEthermintApp_ExportAppStateAndValidators(b *testing.B) { @@ -23,7 +22,6 @@ func BenchmarkEthermintApp_ExportAppStateAndValidators(b *testing.B) { map[int64]bool{}, DefaultNodeHome, 0, - encoding.MakeConfig(ModuleBasics), simtestutil.NewAppOptionsWithFlagHome(DefaultNodeHome), baseapp.SetChainID(ChainID), ) @@ -56,7 +54,6 @@ func BenchmarkEthermintApp_ExportAppStateAndValidators(b *testing.B) { map[int64]bool{}, DefaultNodeHome, 0, - encoding.MakeConfig(ModuleBasics), simtestutil.NewAppOptionsWithFlagHome(DefaultNodeHome), baseapp.SetChainID(ChainID), ) diff --git a/app/export.go b/app/export.go index 5561d479f8..0270703b28 100644 --- a/app/export.go +++ b/app/export.go @@ -22,21 +22,31 @@ import ( tmproto "github.com/cometbft/cometbft/proto/tendermint/types" + sdklog "cosmossdk.io/log" "cosmossdk.io/simapp" storetypes "cosmossdk.io/store/types" + dbm "github.com/cosmos/cosmos-db" servertypes "github.com/cosmos/cosmos-sdk/server/types" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" sdk "github.com/cosmos/cosmos-sdk/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - - "github.com/evmos/ethermint/encoding" ) // NewDefaultGenesisState generates the default state for the application. func NewDefaultGenesisState() simapp.GenesisState { - encCfg := encoding.MakeConfig(ModuleBasics) - return ModuleBasics.DefaultGenesis(encCfg.Codec) + tempApp := NewEthermintApp( + sdklog.NewNopLogger(), + dbm.NewMemDB(), + nil, + true, + map[int64]bool{}, + DefaultNodeHome, + 0, + simtestutil.NewAppOptionsWithFlagHome(DefaultNodeHome), + ) + return tempApp.DefaultGenesis() } // ExportAppStateAndValidators exports the state of the application for a genesis @@ -55,7 +65,7 @@ func (app *EthermintApp) ExportAppStateAndValidators( app.prepForZeroHeightGenesis(ctx, jailAllowedAddrs) } - genState, err := app.mm.ExportGenesisForModules(ctx, app.appCodec, modulesToExport) + genState, err := app.ModuleManager.ExportGenesisForModules(ctx, app.appCodec, modulesToExport) if err != nil { return servertypes.ExportedApp{}, err } diff --git a/app/upgrades.go b/app/upgrades.go index a77de95374..de60e6da67 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -103,7 +103,7 @@ func (app *EthermintApp) RegisterUpgradeHandlers( if err != nil { return nil, err } - return app.mm.RunMigrations(ctx, app.configurator, fromVM) + return app.ModuleManager.RunMigrations(ctx, app.configurator, fromVM) }, ) upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk() diff --git a/app/utils.go b/app/utils.go index b67e10c78e..cd7c1e02e2 100644 --- a/app/utils.go +++ b/app/utils.go @@ -38,7 +38,6 @@ import ( tmproto "github.com/cometbft/cometbft/proto/tendermint/types" tmtypes "github.com/cometbft/cometbft/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/ethermint/encoding" ) // DefaultConsensusParams defines the default Tendermint consensus params used in @@ -76,7 +75,6 @@ func SetupWithDB(isCheckTx bool, patchGenesis func(*EthermintApp, simapp.Genesis map[int64]bool{}, DefaultNodeHome, 5, - encoding.MakeConfig(ModuleBasics), simtestutil.NewAppOptionsWithFlagHome(DefaultNodeHome), baseapp.SetChainID(ChainID), ) diff --git a/cmd/ethermintd/root.go b/cmd/ethermintd/root.go index affd8d36d4..7edf3eee53 100644 --- a/cmd/ethermintd/root.go +++ b/cmd/ethermintd/root.go @@ -52,7 +52,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/crisis" genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" - // rosettaCmd "github.com/cosmos/rosetta/cmd" + // rosettaCmd "github.com/cosmos/rosetta/cmd" <-- "github.com/cosmos/cosmos-sdk/crypto/keyring" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" @@ -60,7 +60,6 @@ import ( ethermintclient "github.com/evmos/ethermint/client" "github.com/evmos/ethermint/client/debug" "github.com/evmos/ethermint/crypto/hd" - "github.com/evmos/ethermint/encoding" "github.com/evmos/ethermint/ethereum/eip712" "github.com/evmos/ethermint/server" servercfg "github.com/evmos/ethermint/server/config" @@ -81,10 +80,14 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) { map[int64]bool{}, app.DefaultNodeHome, 0, - encoding.MakeConfig(app.ModuleBasics), simtestutil.NewAppOptionsWithFlagHome(app.DefaultNodeHome), ) - encodingConfig := encoding.MakeConfig(app.ModuleBasics) + encodingConfig := params.EncodingConfig{ + InterfaceRegistry: tempApp.InterfaceRegistry(), + Codec: tempApp.AppCodec(), + TxConfig: tempApp.TxConfig(), + Amino: tempApp.LegacyAmino(), + } initClientCtx := client.Context{}. WithCodec(encodingConfig.Codec). WithInterfaceRegistry(encodingConfig.InterfaceRegistry). @@ -156,7 +159,7 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) { rootCmd.AddCommand( ethermintclient.ValidateChainID( - genutilcli.InitCmd(app.ModuleBasics, app.DefaultNodeHome), + genutilcli.InitCmd(tempApp.BasicModuleManager, app.DefaultNodeHome), ), genutilcli.CollectGenTxsCmd( banktypes.GenesisBalancesIterator{}, @@ -166,20 +169,20 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) { ), genutilcli.MigrateGenesisCmd(genutilcli.MigrationMap), // TODO: shouldn't this include the local app version instead of the SDK? genutilcli.GenTxCmd( - app.ModuleBasics, + tempApp.BasicModuleManager, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, app.DefaultNodeHome, encodingConfig.TxConfig.SigningContext().ValidatorAddressCodec(), ), - genutilcli.ValidateGenesisCmd(app.ModuleBasics), + genutilcli.ValidateGenesisCmd(tempApp.BasicModuleManager), AddGenesisAccountCmd(app.DefaultNodeHome), tmcli.NewCompletionCmd(rootCmd, true), - ethermintclient.NewTestnetCmd(app.ModuleBasics, banktypes.GenesisBalancesIterator{}), + ethermintclient.NewTestnetCmd(tempApp.BasicModuleManager, banktypes.GenesisBalancesIterator{}), debug.Cmd(), ) - a := appCreator{encodingConfig} + a := appCreator{} server.AddCommands(rootCmd, server.NewDefaultStartOptions(a.newApp, app.DefaultNodeHome), a.appExport, addModuleInitFlags) // add keybase, auxiliary RPC, query, and tx child commands @@ -264,7 +267,6 @@ func txCommand() *cobra.Command { } type appCreator struct { - encCfg params.EncodingConfig } // newApp is an appCreator @@ -324,7 +326,6 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a logger, db, traceStore, true, skipUpgradeHeights, cast.ToString(appOpts.Get(flags.FlagHome)), cast.ToUint(appOpts.Get(sdkserver.FlagInvCheckPeriod)), - a.encCfg, appOpts, baseapp.SetPruning(pruningOpts), baseapp.SetMinGasPrices(cast.ToString(appOpts.Get(sdkserver.FlagMinGasPrices))), @@ -362,13 +363,13 @@ func (a appCreator) appExport( } if height != -1 { - ethermintApp = app.NewEthermintApp(logger, db, traceStore, false, map[int64]bool{}, "", uint(1), a.encCfg, appOpts, baseapp.SetChainID(app.ChainID)) + ethermintApp = app.NewEthermintApp(logger, db, traceStore, false, map[int64]bool{}, "", uint(1), appOpts, baseapp.SetChainID(app.ChainID)) if err := ethermintApp.LoadHeight(height); err != nil { return servertypes.ExportedApp{}, err } } else { - ethermintApp = app.NewEthermintApp(logger, db, traceStore, true, map[int64]bool{}, "", uint(1), a.encCfg, appOpts, baseapp.SetChainID(app.ChainID)) + ethermintApp = app.NewEthermintApp(logger, db, traceStore, true, map[int64]bool{}, "", uint(1), appOpts, baseapp.SetChainID(app.ChainID)) } return ethermintApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport) diff --git a/encoding/config.go b/encoding/config.go index ed1b224c89..c521a33eac 100644 --- a/encoding/config.go +++ b/encoding/config.go @@ -34,8 +34,8 @@ import ( feemarkettypes "github.com/evmos/ethermint/x/feemarket/types" ) -// MakeConfig creates an EncodingConfig for testing -func MakeConfig(mb module.BasicManager) params.EncodingConfig { +// MakeTestEncodingConfig creates an EncodingConfig for testing +func MakeTestEncodingConfig(modules ...module.AppModuleBasic) params.EncodingConfig { cdc := amino.NewLegacyAmino() signingOptions := signing.Options{ @@ -61,6 +61,8 @@ func MakeConfig(mb module.BasicManager) params.EncodingConfig { Amino: cdc, } + mb := module.NewBasicManager(modules...) + enccodec.RegisterLegacyAminoCodec(encodingConfig.Amino) mb.RegisterLegacyAminoCodec(encodingConfig.Amino) enccodec.RegisterInterfaces(encodingConfig.InterfaceRegistry) diff --git a/encoding/config_test.go b/encoding/config_test.go index 3b075b4eb3..abfb364a6a 100644 --- a/encoding/config_test.go +++ b/encoding/config_test.go @@ -8,9 +8,9 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/encoding" "github.com/evmos/ethermint/tests" + "github.com/evmos/ethermint/x/evm" evmtypes "github.com/evmos/ethermint/x/evm/types" ) @@ -25,7 +25,7 @@ func TestTxEncoding(t *testing.T) { err := msg.Sign(ethSigner, signer) require.NoError(t, err) - cfg := encoding.MakeConfig(app.ModuleBasics) + cfg := encoding.MakeTestEncodingConfig(evm.AppModuleBasic{}) _, err = cfg.TxConfig.TxEncoder()(msg) require.Error(t, err, "encoding failed") diff --git a/ethereum/eip712/eip712_test.go b/ethereum/eip712/eip712_test.go index 273be19ac0..f1a6418c74 100644 --- a/ethereum/eip712/eip712_test.go +++ b/ethereum/eip712/eip712_test.go @@ -27,23 +27,16 @@ import ( txtypes "github.com/cosmos/cosmos-sdk/types/tx" "github.com/cosmos/cosmos-sdk/types/tx/signing" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" - // banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/cmd/config" "github.com/evmos/ethermint/encoding" "github.com/evmos/ethermint/testutil" evmtypes "github.com/evmos/ethermint/x/evm/types" - sdktestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" "github.com/cosmos/cosmos-sdk/x/bank" "github.com/cosmos/cosmos-sdk/x/distribution" - // distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/cosmos/cosmos-sdk/x/gov" - // govtypesv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - // govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" "github.com/cosmos/cosmos-sdk/x/staking" - // stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/stretchr/testify/suite" ) @@ -81,15 +74,14 @@ func TestEIP712TestSuite(t *testing.T) { } func (suite *EIP712TestSuite) SetupTest() { - suite.config = encoding.MakeConfig(app.ModuleBasics) + suite.config = encoding.MakeTestEncodingConfig(bank.AppModuleBasic{}, distribution.AppModuleBasic{}, gov.AppModuleBasic{}, staking.AppModuleBasic{}) suite.clientCtx = client.Context{}.WithTxConfig(suite.config.TxConfig) suite.denom = evmtypes.DefaultEVMDenom sdk.GetConfig().SetBech32PrefixForAccount(config.Bech32Prefix, "") eip712.SetEncodingConfig(suite.config) - encCfg := sdktestutil.MakeTestEncodingConfig(bank.AppModuleBasic{}, distribution.AppModuleBasic{}, gov.AppModuleBasic{}, staking.AppModuleBasic{}) - legacytx.RegressionTestingAminoCodec = encCfg.Amino + legacytx.RegressionTestingAminoCodec = suite.config.Amino } // createTestAddress creates random test addresses for messages diff --git a/go.mod b/go.mod index 66087a36a7..6797598e63 100644 --- a/go.mod +++ b/go.mod @@ -6,14 +6,17 @@ toolchain go1.21.1 require ( cosmossdk.io/api v0.7.2 + cosmossdk.io/client/v2 v2.0.0-beta.1 cosmossdk.io/core v0.11.0 cosmossdk.io/errors v1.0.0 cosmossdk.io/log v1.2.1 cosmossdk.io/math v1.2.0 cosmossdk.io/simapp v0.0.0-20231103111158-e83a20081ced cosmossdk.io/store v1.0.0 + cosmossdk.io/x/circuit v0.1.0 cosmossdk.io/x/evidence v0.1.0 cosmossdk.io/x/feegrant v0.1.0 + cosmossdk.io/x/nft v0.0.0-20231023160833-026631cd833c cosmossdk.io/x/tx v0.12.0 cosmossdk.io/x/upgrade v0.1.0 github.com/btcsuite/btcd v0.23.4 @@ -64,11 +67,8 @@ require ( cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v1.1.3 // indirect cloud.google.com/go/storage v1.30.1 // indirect - cosmossdk.io/client/v2 v2.0.0-beta.1 // indirect cosmossdk.io/collections v0.4.0 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect - cosmossdk.io/x/circuit v0.1.0 // indirect - cosmossdk.io/x/nft v0.0.0-20231023160833-026631cd833c // indirect filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/keyring v1.2.2 // indirect github.com/DataDog/zstd v1.5.5 // indirect diff --git a/indexer/kv_indexer_test.go b/indexer/kv_indexer_test.go index f92748c955..202ddc6d8a 100644 --- a/indexer/kv_indexer_test.go +++ b/indexer/kv_indexer_test.go @@ -12,11 +12,11 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/crypto/ethsecp256k1" evmenc "github.com/evmos/ethermint/encoding" "github.com/evmos/ethermint/indexer" "github.com/evmos/ethermint/tests" + "github.com/evmos/ethermint/x/evm" "github.com/evmos/ethermint/x/evm/types" "github.com/stretchr/testify/require" ) @@ -197,5 +197,5 @@ func TestKVIndexer(t *testing.T) { // MakeEncodingConfig creates the EncodingConfig func MakeEncodingConfig() params.EncodingConfig { - return evmenc.MakeConfig(app.ModuleBasics) + return evmenc.MakeTestEncodingConfig(evm.AppModuleBasic{}) } diff --git a/proto/ethermint/evm/v1/tx.proto b/proto/ethermint/evm/v1/tx.proto index 1d216a7b48..d8f9d5bf51 100644 --- a/proto/ethermint/evm/v1/tx.proto +++ b/proto/ethermint/evm/v1/tx.proto @@ -14,6 +14,8 @@ option go_package = "github.com/evmos/ethermint/x/evm/types"; // Msg defines the evm Msg service. service Msg { + option (cosmos.msg.v1.service) = true; + // EthereumTx defines a method submitting Ethereum transactions. rpc EthereumTx(MsgEthereumTx) returns (MsgEthereumTxResponse) { option (google.api.http).post = "/ethermint/evm/v1/ethereum_tx"; diff --git a/proto/ethermint/feemarket/v1/tx.proto b/proto/ethermint/feemarket/v1/tx.proto index c8711960f4..462b354a3a 100644 --- a/proto/ethermint/feemarket/v1/tx.proto +++ b/proto/ethermint/feemarket/v1/tx.proto @@ -10,6 +10,8 @@ option go_package = "github.com/evmos/ethermint/x/feemarket/types"; // Msg defines the erc20 Msg service. service Msg { + option (cosmos.msg.v1.service) = true; + // UpdateParams defined a governance operation for updating the x/feemarket module parameters. // The authority is hard-coded to the Cosmos SDK x/gov module account rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse); diff --git a/rpc/backend/backend_suite_test.go b/rpc/backend/backend_suite_test.go index cbc9fad8ee..0a230937e1 100644 --- a/rpc/backend/backend_suite_test.go +++ b/rpc/backend/backend_suite_test.go @@ -17,7 +17,6 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/suite" - "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/crypto/ethsecp256k1" "github.com/evmos/ethermint/crypto/hd" "github.com/evmos/ethermint/encoding" @@ -25,6 +24,7 @@ import ( "github.com/evmos/ethermint/rpc/backend/mocks" rpctypes "github.com/evmos/ethermint/rpc/types" "github.com/evmos/ethermint/tests" + "github.com/evmos/ethermint/x/evm" evmtypes "github.com/evmos/ethermint/x/evm/types" ) @@ -67,7 +67,7 @@ func (suite *BackendTestSuite) SetupTest() { suite.signer = tests.NewSigner(priv) suite.Require().NoError(err) - encodingConfig := encoding.MakeConfig(app.ModuleBasics) + encodingConfig := encoding.MakeTestEncodingConfig(evm.AppModuleBasic{}) clientCtx := client.Context{}.WithChainID(ChainID). WithHeight(1). WithTxConfig(encodingConfig.TxConfig). @@ -85,8 +85,7 @@ func (suite *BackendTestSuite) SetupTest() { suite.backend.ctx = rpctypes.ContextWithHeight(1) // Add codec - encCfg := encoding.MakeConfig(app.ModuleBasics) - suite.backend.clientCtx.Codec = encCfg.Codec + suite.backend.clientCtx.Codec = encodingConfig.Codec } // buildEthereumTx returns an example legacy Ethereum transaction @@ -165,7 +164,7 @@ func (suite *BackendTestSuite) buildFormattedBlock( func (suite *BackendTestSuite) generateTestKeyring(clientDir string) (keyring.Keyring, error) { buf := bufio.NewReader(os.Stdin) - encCfg := encoding.MakeConfig(app.ModuleBasics) + encCfg := encoding.MakeTestEncodingConfig() return keyring.New(sdk.KeyringServiceName(), keyring.BackendTest, clientDir, buf, encCfg.Codec, []keyring.Option{hd.EthSecp256k1Option()}...) } diff --git a/scripts/protocgen-pulsar.sh b/scripts/protocgen-pulsar.sh index 43c24bab6a..93198eece2 100755 --- a/scripts/protocgen-pulsar.sh +++ b/scripts/protocgen-pulsar.sh @@ -1,5 +1,3 @@ -#!/usr/bin/env bash - # this script is for generating protobuf files for the new google.golang.org/protobuf API set -eo pipefail diff --git a/testutil/network/network.go b/testutil/network/network.go index 7aaf692ee5..b022d33d79 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -66,7 +66,6 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/evmos/ethermint/crypto/hd" - "github.com/evmos/ethermint/encoding" "github.com/evmos/ethermint/server/config" ethermint "github.com/evmos/ethermint/types" evmtypes "github.com/evmos/ethermint/x/evm/types" @@ -93,7 +92,6 @@ func NewAppConstructor(encodingCfg params.EncodingConfig, chainID string) AppCon make(map[int64]bool), val.Ctx.Config.RootDir, 0, - encodingCfg, simtestutil.NewAppOptionsWithFlagHome(val.Ctx.Config.RootDir), baseapp.SetPruning(pruningtypes.NewPruningOptionsFromString(val.AppConfig.Pruning)), baseapp.SetMinGasPrices(val.AppConfig.MinGasPrices), @@ -135,7 +133,24 @@ type Config struct { // DefaultConfig returns a sane default configuration suitable for nearly all // testing requirements. func DefaultConfig() Config { - encCfg := encoding.MakeConfig(app.ModuleBasics) + tempApp := app.NewEthermintApp( + log.NewNopLogger(), + dbm.NewMemDB(), + nil, + true, + map[int64]bool{}, + app.DefaultNodeHome, + 0, + simtestutil.NewAppOptionsWithFlagHome(app.DefaultNodeHome), + ) + + encCfg := params.EncodingConfig{ + InterfaceRegistry: tempApp.InterfaceRegistry(), + Codec: tempApp.AppCodec(), + TxConfig: tempApp.TxConfig(), + Amino: tempApp.LegacyAmino(), + } + chainID := fmt.Sprintf("ethermint_%d-1", tmrand.Int63n(9999999999999)+1) return Config{ Codec: encCfg.Codec, @@ -144,7 +159,7 @@ func DefaultConfig() Config { InterfaceRegistry: encCfg.InterfaceRegistry, AccountRetriever: authtypes.AccountRetriever{}, AppConstructor: NewAppConstructor(encCfg, chainID), - GenesisState: app.ModuleBasics.DefaultGenesis(encCfg.Codec), + GenesisState: tempApp.DefaultGenesis(), TimeoutCommit: 2 * time.Second, ChainID: fmt.Sprintf("ethermint_%d-1", tmrand.Int63n(9999999999999)+1), NumValidators: 4, diff --git a/x/evm/keeper/integration_test.go b/x/evm/keeper/integration_test.go index 71d832728a..2bf2ccba20 100644 --- a/x/evm/keeper/integration_test.go +++ b/x/evm/keeper/integration_test.go @@ -21,6 +21,7 @@ import ( "github.com/evmos/ethermint/encoding" "github.com/evmos/ethermint/tests" "github.com/evmos/ethermint/testutil" + "github.com/evmos/ethermint/x/evm" "github.com/evmos/ethermint/x/feemarket/types" abci "github.com/cometbft/cometbft/abci/types" @@ -180,7 +181,6 @@ func setupChain(localMinGasPricesStr string) { map[int64]bool{}, app.DefaultNodeHome, 5, - encoding.MakeConfig(app.ModuleBasics), simtestutil.NewAppOptionsWithFlagHome(app.DefaultNodeHome), baseapp.SetMinGasPrices(localMinGasPricesStr), baseapp.SetChainID(app.ChainID), @@ -248,7 +248,7 @@ func buildEthTx( } func prepareEthTx(priv *ethsecp256k1.PrivKey, msgEthereumTx *evmtypes.MsgEthereumTx) []byte { - encodingConfig := encoding.MakeConfig(app.ModuleBasics) + encodingConfig := encoding.MakeTestEncodingConfig(evm.AppModuleBasic{}) option, err := codectypes.NewAnyWithValue(&evmtypes.ExtensionOptionsEthereumTx{}) s.Require().NoError(err) diff --git a/x/evm/keeper/keeper_test.go b/x/evm/keeper/keeper_test.go index 16369edf0d..8f36752a05 100644 --- a/x/evm/keeper/keeper_test.go +++ b/x/evm/keeper/keeper_test.go @@ -30,7 +30,6 @@ import ( "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/crypto/ethsecp256k1" - "github.com/evmos/ethermint/encoding" "github.com/evmos/ethermint/server/config" "github.com/evmos/ethermint/tests" ethermint "github.com/evmos/ethermint/types" @@ -223,10 +222,9 @@ func (suite *KeeperTestSuite) SetupAppWithT(checkTx bool, t require.TestingT) { require.NoError(t, err) suite.app.StakingKeeper.SetValidator(suite.ctx, validator) - encodingConfig := encoding.MakeConfig(app.ModuleBasics) - suite.clientCtx = client.Context{}.WithTxConfig(encodingConfig.TxConfig) + suite.clientCtx = client.Context{}.WithTxConfig(suite.app.TxConfig()) suite.ethSigner = ethtypes.LatestSignerForChainID(suite.app.EvmKeeper.ChainID()) - suite.appCodec = encodingConfig.Codec + suite.appCodec = suite.app.AppCodec() suite.denom = evmtypes.DefaultEVMDenom } diff --git a/x/evm/migrations/v4/migrate_test.go b/x/evm/migrations/v4/migrate_test.go index 8ca341f62e..bdaf50a8aa 100644 --- a/x/evm/migrations/v4/migrate_test.go +++ b/x/evm/migrations/v4/migrate_test.go @@ -10,7 +10,6 @@ import ( storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/encoding" v4 "github.com/evmos/ethermint/x/evm/migrations/v4" v4types "github.com/evmos/ethermint/x/evm/migrations/v4/types" @@ -29,7 +28,7 @@ func (ms mockSubspace) GetParamSetIfExists(ctx sdk.Context, ps types.LegacyParam } func TestMigrate(t *testing.T) { - encCfg := encoding.MakeConfig(app.ModuleBasics) + encCfg := encoding.MakeTestEncodingConfig() cdc := encCfg.Codec storeKey := storetypes.NewKVStoreKey(types.ModuleName) diff --git a/x/evm/migrations/v5/migrate_test.go b/x/evm/migrations/v5/migrate_test.go index 6b42a9402b..d051d6873b 100644 --- a/x/evm/migrations/v5/migrate_test.go +++ b/x/evm/migrations/v5/migrate_test.go @@ -7,7 +7,6 @@ import ( "github.com/cosmos/cosmos-sdk/testutil" "github.com/stretchr/testify/require" - "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/encoding" v5 "github.com/evmos/ethermint/x/evm/migrations/v5" v5types "github.com/evmos/ethermint/x/evm/migrations/v5/types" @@ -15,7 +14,7 @@ import ( ) func TestMigrate(t *testing.T) { - encCfg := encoding.MakeConfig(app.ModuleBasics) + encCfg := encoding.MakeTestEncodingConfig() cdc := encCfg.Codec storeKey := storetypes.NewKVStoreKey(types.ModuleName) diff --git a/x/evm/types/msg_test.go b/x/evm/types/msg_test.go index b997290553..50b5cda6d7 100644 --- a/x/evm/types/msg_test.go +++ b/x/evm/types/msg_test.go @@ -20,8 +20,8 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/encoding" + "github.com/evmos/ethermint/x/evm" "github.com/evmos/ethermint/x/evm/types" ) @@ -52,7 +52,7 @@ func (suite *MsgsTestSuite) SetupTest() { suite.chainID = big.NewInt(1) suite.hundredBigInt = big.NewInt(100) - encodingConfig := encoding.MakeConfig(app.ModuleBasics) + encodingConfig := encoding.MakeTestEncodingConfig(evm.AppModuleBasic{}) suite.clientCtx = client.Context{}.WithTxConfig(encodingConfig.TxConfig) } diff --git a/x/evm/types/tx.pb.go b/x/evm/types/tx.pb.go index 078a6e3cda..89d152765c 100644 --- a/x/evm/types/tx.pb.go +++ b/x/evm/types/tx.pb.go @@ -455,69 +455,69 @@ func init() { func init() { proto.RegisterFile("ethermint/evm/v1/tx.proto", fileDescriptor_f75ac0a12d075f21) } var fileDescriptor_f75ac0a12d075f21 = []byte{ - // 983 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xcf, 0x6f, 0x1b, 0x45, + // 992 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xcf, 0x6f, 0x1b, 0x45, 0x14, 0xce, 0xda, 0xeb, 0x5f, 0x63, 0x13, 0xca, 0x2a, 0x51, 0xd6, 0x16, 0xf5, 0x9a, 0x45, 0x80, - 0x5b, 0x29, 0xbb, 0x6a, 0x90, 0x2a, 0xd5, 0x27, 0xe2, 0x26, 0x45, 0x45, 0x89, 0xa8, 0x16, 0xf7, - 0x02, 0x48, 0xd6, 0x64, 0x3d, 0x19, 0x8f, 0xf0, 0xee, 0xac, 0x76, 0xc6, 0x2b, 0x1b, 0x89, 0x4b, - 0x4f, 0x88, 0x13, 0x15, 0xff, 0x00, 0x07, 0x4e, 0x70, 0xe9, 0xa1, 0x67, 0xce, 0x15, 0xa7, 0x0a, - 0x2e, 0x88, 0x83, 0x41, 0x0e, 0x52, 0xa5, 0x1c, 0x39, 0x73, 0x40, 0x33, 0xb3, 0x8e, 0xe3, 0x1a, - 0x27, 0x50, 0x09, 0x2e, 0xd6, 0xbc, 0x79, 0xdf, 0x7b, 0xf3, 0xcd, 0xf7, 0xad, 0xdf, 0x80, 0x2a, - 0xe2, 0x7d, 0x14, 0x07, 0x24, 0xe4, 0x2e, 0x4a, 0x02, 0x37, 0xb9, 0xe1, 0xf2, 0x91, 0x13, 0xc5, - 0x94, 0x53, 0xe3, 0xca, 0x59, 0xca, 0x41, 0x49, 0xe0, 0x24, 0x37, 0x6a, 0x5b, 0x3e, 0x65, 0x01, - 0x65, 0x6e, 0xc0, 0xb0, 0x40, 0x06, 0x0c, 0x2b, 0x68, 0xad, 0xaa, 0x12, 0x5d, 0x19, 0xb9, 0x2a, - 0x48, 0x53, 0xb5, 0xa5, 0x03, 0x44, 0x33, 0x95, 0xdb, 0xc0, 0x14, 0x53, 0x55, 0x23, 0x56, 0xe9, - 0xee, 0xab, 0x98, 0x52, 0x3c, 0x40, 0x2e, 0x8c, 0x88, 0x0b, 0xc3, 0x90, 0x72, 0xc8, 0x09, 0x0d, - 0x67, 0xfd, 0xaa, 0x69, 0x56, 0x46, 0x47, 0xc3, 0x63, 0x17, 0x86, 0xe3, 0x34, 0xf5, 0x0a, 0x0c, - 0x48, 0x48, 0x5d, 0xf9, 0xab, 0xb6, 0xec, 0xef, 0x34, 0xf0, 0xd2, 0x21, 0xc3, 0xfb, 0x82, 0x03, - 0x1a, 0x06, 0x9d, 0x91, 0xd1, 0x04, 0x7a, 0x0f, 0x72, 0x68, 0x6a, 0x0d, 0xad, 0x59, 0xde, 0xd9, - 0x70, 0x54, 0x3b, 0x67, 0xd6, 0xce, 0xd9, 0x0d, 0xc7, 0x9e, 0x44, 0x18, 0x55, 0xa0, 0x33, 0xf2, - 0x29, 0x32, 0x33, 0x0d, 0xad, 0xa9, 0xb5, 0x73, 0xa7, 0x13, 0x4b, 0xdb, 0xf6, 0xe4, 0x96, 0x61, - 0x01, 0xbd, 0x0f, 0x59, 0xdf, 0xcc, 0x36, 0xb4, 0x66, 0xa9, 0x5d, 0xfe, 0x63, 0x62, 0x15, 0xe2, - 0x41, 0xd4, 0xb2, 0xb7, 0x6d, 0x4f, 0x26, 0x0c, 0x03, 0xe8, 0xc7, 0x31, 0x0d, 0x4c, 0x5d, 0x00, - 0x3c, 0xb9, 0x6e, 0x35, 0x3e, 0xff, 0xda, 0x5a, 0xfb, 0xe2, 0xd9, 0xa3, 0xeb, 0x5b, 0x73, 0x49, - 0x16, 0xb8, 0xd9, 0x0f, 0x33, 0xa0, 0x78, 0x80, 0x30, 0xf4, 0xc7, 0x9d, 0x91, 0xb1, 0x01, 0x72, - 0x21, 0x0d, 0x7d, 0x24, 0x99, 0xea, 0x9e, 0x0a, 0x8c, 0x9b, 0xa0, 0x84, 0xa1, 0x10, 0x9a, 0xf8, - 0x8a, 0x59, 0xa9, 0x5d, 0xfd, 0x65, 0x62, 0x6d, 0x2a, 0xcd, 0x59, 0xef, 0x13, 0x87, 0x50, 0x37, - 0x80, 0xbc, 0xef, 0xdc, 0x0d, 0xb9, 0x57, 0xc4, 0x90, 0xdd, 0x13, 0x50, 0xa3, 0x0e, 0xb2, 0x18, - 0x32, 0x49, 0x58, 0x6f, 0x57, 0xa6, 0x13, 0xab, 0xf8, 0x2e, 0x64, 0x07, 0x24, 0x20, 0xdc, 0x13, - 0x09, 0x63, 0x1d, 0x64, 0x38, 0x4d, 0xe9, 0x66, 0x38, 0x35, 0x6e, 0x81, 0x5c, 0x02, 0x07, 0x43, - 0x64, 0xe6, 0xe4, 0x19, 0xaf, 0xaf, 0x3c, 0x63, 0x3a, 0xb1, 0xf2, 0xbb, 0x01, 0x1d, 0x86, 0xdc, - 0x53, 0x15, 0xe2, 0xee, 0x52, 0xe1, 0x7c, 0x43, 0x6b, 0x56, 0x52, 0x2d, 0x2b, 0x40, 0x4b, 0xcc, - 0x82, 0xdc, 0xd0, 0x12, 0x11, 0xc5, 0x66, 0x51, 0x45, 0xb1, 0x88, 0x98, 0x59, 0x52, 0x11, 0x6b, - 0xad, 0x0b, 0x95, 0x7e, 0x78, 0xbc, 0x9d, 0xef, 0x8c, 0xf6, 0x20, 0x87, 0xf6, 0xf7, 0x59, 0x50, - 0xd9, 0xf5, 0x7d, 0xc4, 0xd8, 0x01, 0x61, 0xbc, 0x33, 0x32, 0xde, 0x03, 0x45, 0xbf, 0x0f, 0x49, - 0xd8, 0x25, 0x3d, 0x29, 0x4d, 0xa9, 0xed, 0x5e, 0x44, 0xae, 0x70, 0x5b, 0x80, 0xef, 0xee, 0x9d, - 0x4e, 0xac, 0x82, 0xaf, 0x96, 0x5e, 0xba, 0xe8, 0xcd, 0x35, 0xce, 0xac, 0xd4, 0x38, 0xfb, 0xaf, - 0x35, 0xd6, 0x2f, 0xd6, 0x38, 0xb7, 0xac, 0x71, 0xfe, 0x85, 0x35, 0x2e, 0x9c, 0xd3, 0xf8, 0x23, - 0x50, 0x84, 0x52, 0x28, 0xc4, 0xcc, 0x62, 0x23, 0xdb, 0x2c, 0xef, 0x5c, 0x75, 0x9e, 0xff, 0x0b, - 0x3b, 0x4a, 0xca, 0xce, 0x30, 0x1a, 0xa0, 0x76, 0xe3, 0xc9, 0xc4, 0x5a, 0x3b, 0x9d, 0x58, 0x00, - 0x9e, 0xe9, 0xfb, 0xed, 0xaf, 0x16, 0x98, 0xab, 0xed, 0x9d, 0x35, 0x54, 0x06, 0x96, 0x16, 0x0c, - 0x04, 0x0b, 0x06, 0x96, 0x57, 0x19, 0xf8, 0x67, 0x16, 0x54, 0xf6, 0xc6, 0x21, 0x0c, 0x88, 0x7f, - 0x07, 0xa1, 0xff, 0xc5, 0xc0, 0x5b, 0xa0, 0x2c, 0x0c, 0xe4, 0x24, 0xea, 0xfa, 0x30, 0xba, 0xdc, - 0x42, 0x61, 0x77, 0x87, 0x44, 0xb7, 0x61, 0x34, 0x2b, 0x3d, 0x46, 0x48, 0x96, 0xea, 0xff, 0xa4, - 0xf4, 0x0e, 0x42, 0xa2, 0x34, 0xb5, 0x3f, 0x77, 0xb1, 0xfd, 0xf9, 0x65, 0xfb, 0x0b, 0x2f, 0x6c, - 0x7f, 0x71, 0x85, 0xfd, 0xa5, 0xff, 0xc4, 0x7e, 0xb0, 0x60, 0x7f, 0x79, 0xc1, 0xfe, 0xca, 0x2a, - 0xfb, 0x6d, 0x50, 0xdb, 0x1f, 0x71, 0x14, 0x32, 0x42, 0xc3, 0xf7, 0x23, 0x39, 0xc9, 0xe7, 0x13, - 0xaf, 0xa5, 0x0b, 0xb4, 0xfd, 0x8d, 0x06, 0x36, 0x17, 0x26, 0xa1, 0x87, 0x58, 0x44, 0x43, 0x26, - 0x2f, 0x2a, 0x07, 0xad, 0xa6, 0xe6, 0xa8, 0x9c, 0xad, 0xd7, 0x80, 0x3e, 0xa0, 0x98, 0x99, 0x19, - 0x79, 0xc9, 0xcd, 0xe5, 0x4b, 0x1e, 0x50, 0xec, 0x49, 0x88, 0x71, 0x05, 0x64, 0x63, 0xc4, 0xe5, - 0x07, 0x50, 0xf1, 0xc4, 0xd2, 0xa8, 0x82, 0x62, 0x12, 0x74, 0x51, 0x1c, 0xd3, 0x38, 0x9d, 0x76, - 0x85, 0x24, 0xd8, 0x17, 0xa1, 0x48, 0x09, 0xeb, 0x87, 0x0c, 0xf5, 0x94, 0x89, 0x5e, 0x01, 0x43, - 0x76, 0x9f, 0xa1, 0x5e, 0x4a, 0xf3, 0xa1, 0x06, 0x5e, 0x3e, 0x64, 0xf8, 0x7e, 0xd4, 0x83, 0x1c, - 0xdd, 0x83, 0x31, 0x0c, 0x98, 0x98, 0x15, 0x70, 0xc8, 0xfb, 0x34, 0x26, 0x7c, 0x9c, 0x7e, 0xcd, - 0xe6, 0x8f, 0x8f, 0xb7, 0x37, 0xd2, 0x37, 0x70, 0xb7, 0xd7, 0x8b, 0x11, 0x63, 0x1f, 0xf0, 0x98, - 0x84, 0xd8, 0x9b, 0x43, 0x8d, 0x9b, 0x20, 0x1f, 0xc9, 0x0e, 0xf2, 0xcb, 0x2d, 0xef, 0x98, 0xcb, - 0xd7, 0x50, 0x27, 0xb4, 0x75, 0x61, 0x93, 0x97, 0xa2, 0x5b, 0xeb, 0x0f, 0x9e, 0x3d, 0xba, 0x3e, - 0xef, 0x63, 0x57, 0xc1, 0xd6, 0x73, 0x94, 0x66, 0xda, 0xed, 0x4c, 0x35, 0x90, 0x3d, 0x64, 0xd8, - 0xf8, 0x0c, 0x80, 0x73, 0xef, 0x9f, 0xb5, 0x7c, 0xd0, 0x82, 0xf4, 0xb5, 0xb7, 0x2e, 0x01, 0xcc, - 0xfa, 0xdb, 0x6f, 0x3c, 0xf8, 0xe9, 0xf7, 0xaf, 0x32, 0x96, 0x7d, 0xd5, 0x5d, 0x7e, 0xe2, 0x53, - 0x74, 0x97, 0x8f, 0x8c, 0x8f, 0x41, 0x65, 0x41, 0xb1, 0xd7, 0xfe, 0xb6, 0xff, 0x79, 0x48, 0xed, - 0xda, 0xa5, 0x90, 0x19, 0x89, 0xf6, 0x3b, 0x4f, 0xa6, 0x75, 0xed, 0xe9, 0xb4, 0xae, 0xfd, 0x36, - 0xad, 0x6b, 0x5f, 0x9e, 0xd4, 0xd7, 0x9e, 0x9e, 0xd4, 0xd7, 0x7e, 0x3e, 0xa9, 0xaf, 0x7d, 0xf8, - 0x26, 0x26, 0xbc, 0x3f, 0x3c, 0x72, 0x7c, 0x1a, 0x08, 0x5a, 0x94, 0x9d, 0xa3, 0x39, 0x92, 0x44, - 0xf9, 0x38, 0x42, 0xec, 0x28, 0x2f, 0x9f, 0xfe, 0xb7, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x2f, - 0x83, 0x29, 0x1a, 0x0a, 0x09, 0x00, 0x00, + 0x1b, 0x29, 0xbb, 0x6a, 0x90, 0x2a, 0xd5, 0x27, 0xe2, 0x26, 0x45, 0x45, 0x89, 0xa8, 0x16, 0xf7, + 0x02, 0x48, 0xd6, 0x64, 0x3d, 0x19, 0x8f, 0xf0, 0xee, 0xac, 0x76, 0xc6, 0x96, 0x8d, 0x84, 0x84, + 0x7a, 0x42, 0x9c, 0xa8, 0xf8, 0x07, 0x38, 0x70, 0x82, 0x4b, 0x0e, 0x3d, 0x73, 0xae, 0x38, 0x55, + 0x70, 0x41, 0x1c, 0x0c, 0x72, 0x90, 0x22, 0x72, 0xe4, 0xcc, 0x01, 0xcd, 0xcc, 0x3a, 0x8e, 0x6b, + 0x9c, 0x40, 0x25, 0xb8, 0x44, 0xf3, 0xe6, 0x7d, 0xef, 0xcd, 0x37, 0xdf, 0xb7, 0x79, 0x63, 0x50, + 0x46, 0xbc, 0x8b, 0xe2, 0x80, 0x84, 0xdc, 0x45, 0x83, 0xc0, 0x1d, 0xdc, 0x74, 0xf9, 0xd0, 0x89, + 0x62, 0xca, 0xa9, 0x71, 0xed, 0x3c, 0xe5, 0xa0, 0x41, 0xe0, 0x0c, 0x6e, 0x56, 0x36, 0x7c, 0xca, + 0x02, 0xca, 0xdc, 0x80, 0x61, 0x81, 0x0c, 0x18, 0x56, 0xd0, 0x4a, 0x59, 0x25, 0xda, 0x32, 0x72, + 0x55, 0x90, 0xa4, 0x2a, 0x0b, 0x07, 0x88, 0x66, 0x2a, 0xb7, 0x86, 0x29, 0xa6, 0xaa, 0x46, 0xac, + 0x92, 0xdd, 0x97, 0x31, 0xa5, 0xb8, 0x87, 0x5c, 0x18, 0x11, 0x17, 0x86, 0x21, 0xe5, 0x90, 0x13, + 0x1a, 0x4e, 0xfb, 0x95, 0x93, 0xac, 0x8c, 0x0e, 0xfb, 0x47, 0x2e, 0x0c, 0x47, 0x49, 0xea, 0x25, + 0x18, 0x90, 0x90, 0xba, 0xf2, 0xaf, 0xda, 0xb2, 0xbf, 0xd5, 0xc0, 0x0b, 0x07, 0x0c, 0xef, 0x09, + 0x0e, 0xa8, 0x1f, 0xb4, 0x86, 0x46, 0x1d, 0xe8, 0x1d, 0xc8, 0xa1, 0xa9, 0xd5, 0xb4, 0x7a, 0x71, + 0x7b, 0xcd, 0x51, 0xed, 0x9c, 0x69, 0x3b, 0x67, 0x27, 0x1c, 0x79, 0x12, 0x61, 0x94, 0x81, 0xce, + 0xc8, 0xc7, 0xc8, 0x4c, 0xd5, 0xb4, 0xba, 0xd6, 0xcc, 0x9c, 0x8d, 0x2d, 0x6d, 0xcb, 0x93, 0x5b, + 0x86, 0x05, 0xf4, 0x2e, 0x64, 0x5d, 0x33, 0x5d, 0xd3, 0xea, 0x85, 0x66, 0xf1, 0x8f, 0xb1, 0x95, + 0x8b, 0x7b, 0x51, 0xc3, 0xde, 0xb2, 0x3d, 0x99, 0x30, 0x0c, 0xa0, 0x1f, 0xc5, 0x34, 0x30, 0x75, + 0x01, 0xf0, 0xe4, 0xba, 0x51, 0xfb, 0xec, 0x2b, 0x6b, 0xe5, 0xf3, 0xd3, 0xe3, 0xcd, 0x8d, 0x99, + 0x24, 0x73, 0xdc, 0xec, 0x47, 0x29, 0x90, 0xdf, 0x47, 0x18, 0xfa, 0xa3, 0xd6, 0xd0, 0x58, 0x03, + 0x99, 0x90, 0x86, 0x3e, 0x92, 0x4c, 0x75, 0x4f, 0x05, 0xc6, 0x2d, 0x50, 0xc0, 0x50, 0x08, 0x4d, + 0x7c, 0xc5, 0xac, 0xd0, 0x2c, 0xff, 0x3c, 0xb6, 0xd6, 0x95, 0xe6, 0xac, 0xf3, 0x91, 0x43, 0xa8, + 0x1b, 0x40, 0xde, 0x75, 0xee, 0x85, 0xdc, 0xcb, 0x63, 0xc8, 0xee, 0x0b, 0xa8, 0x51, 0x05, 0x69, + 0x0c, 0x99, 0x24, 0xac, 0x37, 0x4b, 0x93, 0xb1, 0x95, 0x7f, 0x1b, 0xb2, 0x7d, 0x12, 0x10, 0xee, + 0x89, 0x84, 0xb1, 0x0a, 0x52, 0x9c, 0x26, 0x74, 0x53, 0x9c, 0x1a, 0xb7, 0x41, 0x66, 0x00, 0x7b, + 0x7d, 0x64, 0x66, 0xe4, 0x19, 0xaf, 0x2e, 0x3d, 0x63, 0x32, 0xb6, 0xb2, 0x3b, 0x01, 0xed, 0x87, + 0xdc, 0x53, 0x15, 0xe2, 0xee, 0x52, 0xe1, 0x6c, 0x4d, 0xab, 0x97, 0x12, 0x2d, 0x4b, 0x40, 0x1b, + 0x98, 0x39, 0xb9, 0xa1, 0x0d, 0x44, 0x14, 0x9b, 0x79, 0x15, 0xc5, 0x22, 0x62, 0x66, 0x41, 0x45, + 0xac, 0xb1, 0x2a, 0x54, 0xfa, 0xfe, 0xf1, 0x56, 0xb6, 0x35, 0xdc, 0x85, 0x1c, 0xda, 0xdf, 0xa5, + 0x41, 0x69, 0xc7, 0xf7, 0x11, 0x63, 0xfb, 0x84, 0xf1, 0xd6, 0xd0, 0x78, 0x07, 0xe4, 0xfd, 0x2e, + 0x24, 0x61, 0x9b, 0x74, 0xa4, 0x34, 0x85, 0xa6, 0x7b, 0x19, 0xb9, 0xdc, 0x1d, 0x01, 0xbe, 0xb7, + 0x7b, 0x36, 0xb6, 0x72, 0xbe, 0x5a, 0x7a, 0xc9, 0xa2, 0x33, 0xd3, 0x38, 0xb5, 0x54, 0xe3, 0xf4, + 0xbf, 0xd6, 0x58, 0xbf, 0x5c, 0xe3, 0xcc, 0xa2, 0xc6, 0xd9, 0xe7, 0xd6, 0x38, 0x77, 0x41, 0xe3, + 0x0f, 0x40, 0x1e, 0x4a, 0xa1, 0x10, 0x33, 0xf3, 0xb5, 0x74, 0xbd, 0xb8, 0x7d, 0xdd, 0x79, 0xf6, + 0x5f, 0xd8, 0x51, 0x52, 0xb6, 0xfa, 0x51, 0x0f, 0x35, 0x6b, 0x4f, 0xc6, 0xd6, 0xca, 0xd9, 0xd8, + 0x02, 0xf0, 0x5c, 0xdf, 0x6f, 0x7e, 0xb1, 0xc0, 0x4c, 0x6d, 0xef, 0xbc, 0xa1, 0x32, 0xb0, 0x30, + 0x67, 0x20, 0x98, 0x33, 0xb0, 0xb8, 0xcc, 0xc0, 0x3f, 0xd3, 0xa0, 0xb4, 0x3b, 0x0a, 0x61, 0x40, + 0xfc, 0xbb, 0x08, 0xfd, 0x2f, 0x06, 0xde, 0x06, 0x45, 0x61, 0x20, 0x27, 0x51, 0xdb, 0x87, 0xd1, + 0xd5, 0x16, 0x0a, 0xbb, 0x5b, 0x24, 0xba, 0x03, 0xa3, 0x69, 0xe9, 0x11, 0x42, 0xb2, 0x54, 0xff, + 0x27, 0xa5, 0x77, 0x11, 0x12, 0xa5, 0x89, 0xfd, 0x99, 0xcb, 0xed, 0xcf, 0x2e, 0xda, 0x9f, 0x7b, + 0x6e, 0xfb, 0xf3, 0x4b, 0xec, 0x2f, 0xfc, 0x27, 0xf6, 0x83, 0x39, 0xfb, 0x8b, 0x73, 0xf6, 0x97, + 0x96, 0xd9, 0x6f, 0x83, 0xca, 0xde, 0x90, 0xa3, 0x90, 0x11, 0x1a, 0xbe, 0x1b, 0xc9, 0x49, 0x3e, + 0x9b, 0x78, 0x0d, 0x5d, 0xa0, 0xed, 0xaf, 0x35, 0xb0, 0x3e, 0x37, 0x09, 0x3d, 0xc4, 0x22, 0x1a, + 0x32, 0x79, 0x51, 0x39, 0x68, 0x35, 0x35, 0x47, 0xe5, 0x6c, 0xbd, 0x01, 0xf4, 0x1e, 0xc5, 0xcc, + 0x4c, 0xc9, 0x4b, 0xae, 0x2f, 0x5e, 0x72, 0x9f, 0x62, 0x4f, 0x42, 0x8c, 0x6b, 0x20, 0x1d, 0x23, + 0x2e, 0x3f, 0x80, 0x92, 0x27, 0x96, 0x46, 0x19, 0xe4, 0x07, 0x41, 0x1b, 0xc5, 0x31, 0x8d, 0x93, + 0x69, 0x97, 0x1b, 0x04, 0x7b, 0x22, 0x14, 0x29, 0x61, 0x7d, 0x9f, 0xa1, 0x8e, 0x32, 0xd1, 0xcb, + 0x61, 0xc8, 0x1e, 0x30, 0xd4, 0x49, 0x68, 0x3e, 0xd2, 0xc0, 0x8b, 0x07, 0x0c, 0x3f, 0x88, 0x3a, + 0x90, 0xa3, 0xfb, 0x30, 0x86, 0x01, 0x13, 0xb3, 0x02, 0xf6, 0x79, 0x97, 0xc6, 0x84, 0x8f, 0x92, + 0xaf, 0xd9, 0xfc, 0xe1, 0xf1, 0xd6, 0x5a, 0xf2, 0x06, 0xee, 0x74, 0x3a, 0x31, 0x62, 0xec, 0x3d, + 0x1e, 0x93, 0x10, 0x7b, 0x33, 0xa8, 0x71, 0x0b, 0x64, 0x23, 0xd9, 0x41, 0x7e, 0xb9, 0xc5, 0x6d, + 0x73, 0xf1, 0x1a, 0xea, 0x84, 0xa6, 0x2e, 0x6c, 0xf2, 0x12, 0x74, 0x63, 0xf5, 0xe1, 0xe9, 0xf1, + 0xe6, 0xac, 0x8f, 0x5d, 0x06, 0x1b, 0xcf, 0x50, 0x9a, 0x6a, 0xb7, 0xfd, 0xbb, 0x06, 0xd2, 0x07, + 0x0c, 0x1b, 0x9f, 0x00, 0x70, 0xe1, 0xfd, 0xb3, 0x16, 0x0f, 0x9a, 0x93, 0xbe, 0xf2, 0xc6, 0x15, + 0x80, 0x69, 0x7f, 0xfb, 0xb5, 0x87, 0x3f, 0xfe, 0xf6, 0x65, 0xca, 0xb2, 0xaf, 0xbb, 0x8b, 0x4f, + 0x7c, 0x82, 0x6e, 0xf3, 0xa1, 0xf1, 0x21, 0x28, 0xcd, 0x29, 0xf6, 0xca, 0xdf, 0xf6, 0xbf, 0x08, + 0xa9, 0xdc, 0xb8, 0x12, 0x32, 0x25, 0x51, 0xc9, 0x7c, 0x7a, 0x7a, 0xbc, 0xa9, 0x35, 0xdf, 0x7a, + 0x32, 0xa9, 0x6a, 0x4f, 0x27, 0x55, 0xed, 0xd7, 0x49, 0x55, 0xfb, 0xe2, 0xa4, 0xba, 0xf2, 0xf4, + 0xa4, 0xba, 0xf2, 0xd3, 0x49, 0x75, 0xe5, 0xfd, 0xd7, 0x31, 0xe1, 0xdd, 0xfe, 0xa1, 0xe3, 0xd3, + 0x40, 0xb0, 0xa3, 0xec, 0x02, 0xdb, 0xa1, 0xe4, 0xcb, 0x47, 0x11, 0x62, 0x87, 0x59, 0xf9, 0x0b, + 0xe0, 0xcd, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x89, 0x91, 0xb3, 0x26, 0x11, 0x09, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/evm/types/utils_test.go b/x/evm/types/utils_test.go index 500071dd70..9d3e80c511 100644 --- a/x/evm/types/utils_test.go +++ b/x/evm/types/utils_test.go @@ -10,8 +10,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" proto "github.com/cosmos/gogoproto/proto" - "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/encoding" + "github.com/evmos/ethermint/x/evm" evmtypes "github.com/evmos/ethermint/x/evm/types" "github.com/evmos/ethermint/tests" @@ -52,7 +52,7 @@ func TestUnwrapEthererumMsg(t *testing.T) { _, err := evmtypes.UnwrapEthereumMsg(nil, common.Hash{}) require.NotNil(t, err) - encodingConfig := encoding.MakeConfig(app.ModuleBasics) + encodingConfig := encoding.MakeTestEncodingConfig(evm.AppModuleBasic{}) clientCtx := client.Context{}.WithTxConfig(encodingConfig.TxConfig) builder, _ := clientCtx.TxConfig.NewTxBuilder().(authtx.ExtensionOptionsTxBuilder) diff --git a/x/feemarket/keeper/integration_test.go b/x/feemarket/keeper/integration_test.go index d95bea42e8..7f40a06d2b 100644 --- a/x/feemarket/keeper/integration_test.go +++ b/x/feemarket/keeper/integration_test.go @@ -22,7 +22,6 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/crypto/ethsecp256k1" - "github.com/evmos/ethermint/encoding" "github.com/evmos/ethermint/tests" "github.com/evmos/ethermint/testutil" "github.com/evmos/ethermint/x/feemarket/types" @@ -492,7 +491,6 @@ func setupChain(localMinGasPricesStr string) { map[int64]bool{}, app.DefaultNodeHome, 5, - encoding.MakeConfig(app.ModuleBasics), simtestutil.NewAppOptionsWithFlagHome(app.DefaultNodeHome), baseapp.SetMinGasPrices(localMinGasPricesStr), baseapp.SetChainID(app.ChainID), @@ -560,11 +558,11 @@ func buildEthTx( } func prepareEthTx(priv *ethsecp256k1.PrivKey, msgEthereumTx *evmtypes.MsgEthereumTx) []byte { - encodingConfig := encoding.MakeConfig(app.ModuleBasics) + txConfig := s.app.TxConfig() option, err := codectypes.NewAnyWithValue(&evmtypes.ExtensionOptionsEthereumTx{}) s.Require().NoError(err) - txBuilder := encodingConfig.TxConfig.NewTxBuilder() + txBuilder := txConfig.NewTxBuilder() builder, ok := txBuilder.(authtx.ExtensionOptionsTxBuilder) s.Require().True(ok) builder.SetExtensionOptions(option) @@ -585,7 +583,7 @@ func prepareEthTx(priv *ethsecp256k1.PrivKey, msgEthereumTx *evmtypes.MsgEthereu builder.SetGasLimit(msgEthereumTx.GetGas()) // bz are bytes to be broadcasted over the network - bz, err := encodingConfig.TxConfig.TxEncoder()(txBuilder.GetTx()) + bz, err := txConfig.TxEncoder()(txBuilder.GetTx()) s.Require().NoError(err) return bz @@ -610,10 +608,10 @@ func finalizeEthBlock(priv *ethsecp256k1.PrivKey, msgEthereumTx *evmtypes.MsgEth } func prepareCosmosTx(priv *ethsecp256k1.PrivKey, gasPrice *sdkmath.Int, msgs ...sdk.Msg) []byte { - encodingConfig := encoding.MakeConfig(app.ModuleBasics) + txConfig := s.app.TxConfig() accountAddress := sdk.AccAddress(priv.PubKey().Address().Bytes()) - txBuilder := encodingConfig.TxConfig.NewTxBuilder() + txBuilder := txConfig.NewTxBuilder() txBuilder.SetGasLimit(1000000) if gasPrice == nil { @@ -628,7 +626,7 @@ func prepareCosmosTx(priv *ethsecp256k1.PrivKey, gasPrice *sdkmath.Int, msgs ... seq, err := s.app.AccountKeeper.GetSequence(s.ctx, accountAddress) s.Require().NoError(err) - defaultSignMode, err := authsigning.APISignModeToInternal(encodingConfig.TxConfig.SignModeHandler().DefaultMode()) + defaultSignMode, err := authsigning.APISignModeToInternal(txConfig.SignModeHandler().DefaultMode()) s.Require().NoError(err) // First round: we gather all the signer infos. We use the "set empty @@ -658,7 +656,7 @@ func prepareCosmosTx(priv *ethsecp256k1.PrivKey, gasPrice *sdkmath.Int, msgs ... sigV2, err = tx.SignWithPrivKey( context.TODO(), defaultSignMode, signerData, - txBuilder, priv, encodingConfig.TxConfig, + txBuilder, priv, txConfig, seq, ) s.Require().NoError(err) @@ -668,7 +666,7 @@ func prepareCosmosTx(priv *ethsecp256k1.PrivKey, gasPrice *sdkmath.Int, msgs ... s.Require().NoError(err) // bz are bytes to be broadcasted over the network - bz, err := encodingConfig.TxConfig.TxEncoder()(txBuilder.GetTx()) + bz, err := txConfig.TxEncoder()(txBuilder.GetTx()) s.Require().NoError(err) return bz } diff --git a/x/feemarket/keeper/keeper_test.go b/x/feemarket/keeper/keeper_test.go index 0d8034f626..3b05f1c623 100644 --- a/x/feemarket/keeper/keeper_test.go +++ b/x/feemarket/keeper/keeper_test.go @@ -25,7 +25,6 @@ import ( "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/crypto/ethsecp256k1" - "github.com/evmos/ethermint/encoding" "github.com/evmos/ethermint/tests" ethermint "github.com/evmos/ethermint/types" evmtypes "github.com/evmos/ethermint/x/evm/types" @@ -139,10 +138,9 @@ func (suite *KeeperTestSuite) SetupApp(checkTx bool) { require.NoError(t, err) suite.app.StakingKeeper.SetValidator(suite.ctx, validator) - encodingConfig := encoding.MakeConfig(app.ModuleBasics) - suite.clientCtx = client.Context{}.WithTxConfig(encodingConfig.TxConfig) + suite.clientCtx = client.Context{}.WithTxConfig(suite.app.TxConfig()) suite.ethSigner = ethtypes.LatestSignerForChainID(suite.app.EvmKeeper.ChainID()) - suite.appCodec = encodingConfig.Codec + suite.appCodec = suite.app.AppCodec() suite.denom = evmtypes.DefaultEVMDenom } diff --git a/x/feemarket/migrations/v4/migrate_test.go b/x/feemarket/migrations/v4/migrate_test.go index 6a2a2076fd..6f32562283 100644 --- a/x/feemarket/migrations/v4/migrate_test.go +++ b/x/feemarket/migrations/v4/migrate_test.go @@ -6,7 +6,6 @@ import ( storetypes "cosmossdk.io/store/types" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/evmos/ethermint/app" "github.com/evmos/ethermint/encoding" v4 "github.com/evmos/ethermint/x/feemarket/migrations/v4" "github.com/evmos/ethermint/x/feemarket/types" @@ -30,7 +29,7 @@ func (ms mockSubspace) GetParamSetIfExists(ctx sdk.Context, ps types.LegacyParam } func TestMigrate(t *testing.T) { - encCfg := encoding.MakeConfig(app.ModuleBasics) + encCfg := encoding.MakeTestEncodingConfig() cdc := encCfg.Codec storeKey := storetypes.NewKVStoreKey(types.ModuleName) diff --git a/x/feemarket/types/feemarket.pb.go b/x/feemarket/types/feemarket.pb.go index 7e18d917df..77615fbf6b 100644 --- a/x/feemarket/types/feemarket.pb.go +++ b/x/feemarket/types/feemarket.pb.go @@ -116,34 +116,34 @@ func init() { } var fileDescriptor_4feb8b20cf98e6e1 = []byte{ - // 421 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0xcf, 0x6a, 0xdb, 0x40, - 0x10, 0xc6, 0xb5, 0x75, 0xe2, 0x28, 0x9b, 0x1a, 0xcc, 0x92, 0x14, 0x35, 0xa1, 0x8a, 0x68, 0xa1, - 0xe8, 0xd0, 0x4a, 0x98, 0x5c, 0x7a, 0xe9, 0xc5, 0x35, 0xe9, 0x1f, 0x5a, 0x08, 0x82, 0x5e, 0x7a, - 0x59, 0x56, 0x9b, 0x89, 0xb4, 0x44, 0xbb, 0x6b, 0xb4, 0x1b, 0x53, 0xbf, 0x45, 0x1f, 0xa6, 0x0f, - 0x11, 0xe8, 0x25, 0xf4, 0x54, 0x7a, 0x08, 0xc5, 0x7e, 0x91, 0x62, 0xad, 0x2d, 0x19, 0x7a, 0xeb, - 0x4d, 0x3b, 0xbf, 0xef, 0xfb, 0x98, 0x19, 0x0d, 0x7e, 0x0e, 0xb6, 0x84, 0x5a, 0x0a, 0x65, 0xd3, - 0x2b, 0x00, 0xc9, 0xea, 0x6b, 0xb0, 0xe9, 0x6c, 0xd4, 0x3d, 0x92, 0x69, 0xad, 0xad, 0x26, 0x8f, - 0x5a, 0x5d, 0xd2, 0xa1, 0xd9, 0xe8, 0xf8, 0xb0, 0xd0, 0x85, 0x6e, 0x24, 0xe9, 0xea, 0xcb, 0xa9, - 0x8f, 0x1f, 0x73, 0x6d, 0xa4, 0x36, 0xd4, 0x01, 0xf7, 0x70, 0xe8, 0xe9, 0x8f, 0x1e, 0xee, 0x5f, - 0xb0, 0x9a, 0x49, 0x43, 0x42, 0x7c, 0xa0, 0x34, 0xcd, 0x99, 0x01, 0x7a, 0x05, 0x10, 0xa0, 0x08, - 0xc5, 0x7e, 0xb6, 0xaf, 0xf4, 0x98, 0x19, 0x38, 0x07, 0x20, 0xaf, 0xf1, 0xc9, 0x06, 0x52, 0x5e, - 0x32, 0x55, 0x00, 0xbd, 0x04, 0xa5, 0xa5, 0x50, 0xcc, 0xea, 0x3a, 0x78, 0x10, 0xa1, 0x78, 0x90, - 0x05, 0xb9, 0x53, 0xbf, 0x69, 0x04, 0x93, 0x8e, 0x93, 0x33, 0x7c, 0x04, 0x15, 0x33, 0x56, 0x70, - 0x61, 0xe7, 0x54, 0xde, 0x54, 0x56, 0x4c, 0x2b, 0x01, 0x75, 0xd0, 0x6b, 0x8c, 0x87, 0x1d, 0xfc, - 0xd4, 0x32, 0xf2, 0x0c, 0x0f, 0x40, 0xb1, 0xbc, 0x02, 0x5a, 0x82, 0x28, 0x4a, 0x1b, 0xec, 0x46, - 0x28, 0xee, 0x65, 0x0f, 0x5d, 0xf1, 0x5d, 0x53, 0x23, 0xaf, 0xb0, 0xdf, 0x76, 0xdd, 0x8f, 0x50, - 0xbc, 0x3f, 0x7e, 0x72, 0x7b, 0x7f, 0xea, 0xfd, 0xbe, 0x3f, 0x3d, 0x72, 0xb3, 0x9a, 0xcb, 0xeb, - 0x44, 0xe8, 0x54, 0x32, 0x5b, 0x26, 0xef, 0x95, 0xcd, 0xf6, 0xd6, 0x4d, 0x92, 0xcf, 0x78, 0x20, - 0x85, 0xa2, 0x05, 0x5b, 0xed, 0x46, 0x70, 0x08, 0xf6, 0x1a, 0xfb, 0x68, 0x6d, 0x3f, 0xf9, 0xd7, - 0xfe, 0x11, 0x0a, 0xc6, 0xe7, 0x13, 0xe0, 0x3f, 0xbf, 0xbf, 0xc4, 0xeb, 0x4d, 0x4e, 0x80, 0x67, - 0x07, 0x52, 0xa8, 0xb7, 0xcc, 0x5c, 0xac, 0x52, 0x08, 0xc5, 0x64, 0x13, 0xbb, 0x35, 0xa7, 0xff, - 0xbf, 0xd9, 0x43, 0x97, 0xdd, 0xad, 0xe5, 0xc3, 0x8e, 0xbf, 0x33, 0xdc, 0xcd, 0x86, 0x42, 0x09, - 0x2b, 0x58, 0xd5, 0xfe, 0xb3, 0xf1, 0xf9, 0xed, 0x22, 0x44, 0x77, 0x8b, 0x10, 0xfd, 0x59, 0x84, - 0xe8, 0xdb, 0x32, 0xf4, 0xee, 0x96, 0xa1, 0xf7, 0x6b, 0x19, 0x7a, 0x5f, 0x5e, 0x14, 0xc2, 0x96, - 0x37, 0x79, 0xc2, 0xb5, 0x4c, 0x61, 0x26, 0xb5, 0x49, 0xbb, 0x4b, 0xfb, 0xba, 0x75, 0x6b, 0x76, - 0x3e, 0x05, 0x93, 0xf7, 0x9b, 0xe3, 0x38, 0xfb, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x98, 0x00, 0x47, - 0x1d, 0x8f, 0x02, 0x00, 0x00, + // 419 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x52, 0xcf, 0x6a, 0xdb, 0x30, + 0x18, 0xb7, 0x96, 0x36, 0x75, 0xd5, 0x05, 0x82, 0x68, 0x87, 0xd7, 0x32, 0xd7, 0x6c, 0x30, 0x7c, + 0xd8, 0x6c, 0x42, 0x2f, 0xbb, 0xec, 0x92, 0x85, 0xee, 0x0f, 0x1b, 0x14, 0xc3, 0x2e, 0xbb, 0x08, + 0x59, 0xfd, 0x6a, 0x8b, 0x5a, 0x52, 0xb0, 0xd4, 0xb0, 0xbc, 0xc5, 0x1e, 0x66, 0x0f, 0x51, 0xd8, + 0xa5, 0xec, 0x34, 0x76, 0x28, 0x23, 0x79, 0x91, 0x11, 0x2b, 0xb1, 0x03, 0xbb, 0xed, 0xe6, 0xef, + 0xf7, 0x8f, 0xcf, 0x3f, 0x7d, 0xf8, 0x39, 0xd8, 0x12, 0x6a, 0x29, 0x94, 0x4d, 0xaf, 0x00, 0x24, + 0xab, 0xaf, 0xc1, 0xa6, 0xb3, 0x51, 0x37, 0x24, 0xd3, 0x5a, 0x5b, 0x4d, 0x1e, 0xb5, 0xba, 0xa4, + 0xa3, 0x66, 0xa3, 0xe3, 0xc7, 0x5c, 0x1b, 0xa9, 0x0d, 0x6d, 0x54, 0xa9, 0x1b, 0x9c, 0xe5, 0xf8, + 0xb0, 0xd0, 0x85, 0x76, 0xf8, 0xea, 0xcb, 0xa1, 0x4f, 0x7f, 0xf4, 0x70, 0xff, 0x82, 0xd5, 0x4c, + 0x1a, 0x12, 0xe2, 0x03, 0xa5, 0x69, 0xce, 0x0c, 0xd0, 0x2b, 0x80, 0x00, 0x45, 0x28, 0xf6, 0xb3, + 0x7d, 0xa5, 0xc7, 0xcc, 0xc0, 0x39, 0x00, 0x79, 0x8d, 0x4f, 0x36, 0x24, 0xe5, 0x25, 0x53, 0x05, + 0xd0, 0x4b, 0x50, 0x5a, 0x0a, 0xc5, 0xac, 0xae, 0x83, 0x07, 0x11, 0x8a, 0x07, 0x59, 0x90, 0x3b, + 0xf5, 0x9b, 0x46, 0x30, 0xe9, 0x78, 0x72, 0x86, 0x8f, 0xa0, 0x62, 0xc6, 0x0a, 0x2e, 0xec, 0x9c, + 0xca, 0x9b, 0xca, 0x8a, 0x69, 0x25, 0xa0, 0x0e, 0x7a, 0x8d, 0xf1, 0xb0, 0x23, 0x3f, 0xb5, 0x1c, + 0x79, 0x86, 0x07, 0xa0, 0x58, 0x5e, 0x01, 0x2d, 0x41, 0x14, 0xa5, 0x0d, 0x76, 0x23, 0x14, 0xf7, + 0xb2, 0x87, 0x0e, 0x7c, 0xd7, 0x60, 0xe4, 0x15, 0xf6, 0xdb, 0xad, 0xfb, 0x11, 0x8a, 0xf7, 0xc7, + 0x4f, 0x6e, 0xef, 0x4f, 0xbd, 0xdf, 0xf7, 0xa7, 0x47, 0xae, 0x01, 0x73, 0x79, 0x9d, 0x08, 0x9d, + 0x4a, 0x66, 0xcb, 0xe4, 0xbd, 0xb2, 0xd9, 0xde, 0x7a, 0x49, 0xf2, 0x19, 0x0f, 0xa4, 0x50, 0xb4, + 0x60, 0xab, 0xc6, 0x04, 0x87, 0x60, 0xaf, 0xb1, 0x8f, 0xd6, 0xf6, 0x93, 0x7f, 0xed, 0x1f, 0xa1, + 0x60, 0x7c, 0x3e, 0x01, 0xfe, 0xf3, 0xfb, 0x4b, 0xbc, 0xee, 0x77, 0x02, 0x3c, 0x3b, 0x90, 0x42, + 0xbd, 0x65, 0xe6, 0x62, 0x95, 0x42, 0x28, 0x26, 0x9b, 0xd8, 0xad, 0xff, 0xf4, 0xff, 0x37, 0x7b, + 0xe8, 0xb2, 0xbb, 0x5a, 0x3e, 0xec, 0xf8, 0x3b, 0xc3, 0xdd, 0x6c, 0x28, 0x94, 0xb0, 0x82, 0x55, + 0xed, 0x9b, 0x8d, 0xcf, 0x6f, 0x17, 0x21, 0xba, 0x5b, 0x84, 0xe8, 0xcf, 0x22, 0x44, 0xdf, 0x96, + 0xa1, 0x77, 0xb7, 0x0c, 0xbd, 0x5f, 0xcb, 0xd0, 0xfb, 0xf2, 0xa2, 0x10, 0xb6, 0xbc, 0xc9, 0x13, + 0xae, 0x65, 0x0a, 0x33, 0xa9, 0x4d, 0xda, 0x5d, 0xda, 0xd7, 0xad, 0x5b, 0xb3, 0xf3, 0x29, 0x98, + 0xbc, 0xdf, 0x1c, 0xc7, 0xd9, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x59, 0x6e, 0xcc, 0xcd, 0x8f, + 0x02, 0x00, 0x00, } func (m *Params) Marshal() (dAtA []byte, err error) { diff --git a/x/feemarket/types/tx.pb.go b/x/feemarket/types/tx.pb.go index 6142dbd984..836ca3ab6a 100644 --- a/x/feemarket/types/tx.pb.go +++ b/x/feemarket/types/tx.pb.go @@ -132,7 +132,7 @@ func init() { func init() { proto.RegisterFile("ethermint/feemarket/v1/tx.proto", fileDescriptor_78aff2584dbf2838) } var fileDescriptor_78aff2584dbf2838 = []byte{ - // 319 bytes of a gzipped FileDescriptorProto + // 327 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0x2d, 0xc9, 0x48, 0x2d, 0xca, 0xcd, 0xcc, 0x2b, 0xd1, 0x4f, 0x4b, 0x4d, 0xcd, 0x4d, 0x2c, 0xca, 0x4e, 0x2d, 0xd1, 0x2f, 0x33, 0xd4, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x83, 0x2b, 0xd0, @@ -146,13 +146,14 @@ var fileDescriptor_78aff2584dbf2838 = []byte{ 0xe6, 0xa5, 0x07, 0x21, 0x94, 0x0a, 0xd9, 0x70, 0xb1, 0x15, 0x80, 0x4d, 0x90, 0x60, 0x52, 0x60, 0xd4, 0xe0, 0x36, 0x92, 0xd3, 0xc3, 0xee, 0x4d, 0x3d, 0x88, 0x3d, 0x4e, 0x2c, 0x27, 0xee, 0xc9, 0x33, 0x04, 0x41, 0xf5, 0x58, 0xf1, 0x35, 0x3d, 0xdf, 0xa0, 0x85, 0x30, 0x4d, 0x49, 0x92, 0x4b, - 0x1c, 0xcd, 0x61, 0x41, 0xa9, 0xc5, 0x05, 0xf9, 0x79, 0xc5, 0xa9, 0x46, 0xf9, 0x5c, 0xcc, 0xbe, + 0x1c, 0xcd, 0x61, 0x41, 0xa9, 0xc5, 0x05, 0xf9, 0x79, 0xc5, 0xa9, 0x46, 0x65, 0x5c, 0xcc, 0xbe, 0xc5, 0xe9, 0x42, 0x19, 0x5c, 0x3c, 0x28, 0xee, 0x56, 0xc7, 0x65, 0x1f, 0x9a, 0x39, 0x52, 0xfa, - 0x44, 0x2a, 0x84, 0x59, 0xe8, 0xe4, 0x76, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, - 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, 0x0c, - 0x51, 0x3a, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0xa9, 0x65, 0xa0, - 0xb8, 0x43, 0x44, 0x47, 0x05, 0x52, 0x84, 0x94, 0x54, 0x16, 0xa4, 0x16, 0x27, 0xb1, 0x81, 0x03, - 0xdd, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0xc8, 0xd6, 0x7f, 0x38, 0x21, 0x02, 0x00, 0x00, + 0x44, 0x2a, 0x84, 0x59, 0x28, 0xc5, 0xda, 0xf0, 0x7c, 0x83, 0x16, 0xa3, 0x93, 0xdb, 0x89, 0x47, + 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, + 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, 0xe9, 0xa4, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, + 0x25, 0xe7, 0xe7, 0xea, 0xa7, 0x96, 0x81, 0xa2, 0x10, 0x11, 0x2b, 0x15, 0x48, 0xf1, 0x52, 0x52, + 0x59, 0x90, 0x5a, 0x9c, 0xc4, 0x06, 0x0e, 0x7b, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6f, + 0xa8, 0x62, 0xbb, 0x28, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used.